1.栈的定义
struct Stack{
T* data; // 数据元素存储空间的开始地址
int top; // 栈顶元素所处数组位置
int max; // 栈存储空间最多可存储的数据元素个数
};
typedef int T; // 数据元素的数据类型
2.入栈和出栈的操作
Stack_Push(stk,e)//入栈
e=Stack_Pop(stk)//出栈
3.利用栈实现整数的十进制转八进制
利用stack栈实现整数的十进制转八进制,输入参数:十进制整数 e, 打印e的八进制结果,末尾换行
//算法:十进制转八进制就是十位数除8的余数后得先出,符合栈的先进后出的特点,先给栈分配空间,然后用Stack_Push(stk,e%8),最后e=Stack_Pop(stk)
void Decimal_Conversion_Octal(T e)
{Stack* stk=Stack_Create(32);
while(e!=0)
{Stack_Push(stk,e%8);
e=e/8;}
if(!Stack_IsEmpty(stk))
{
e=Stack_Pop(stk);
printf("%d",e);}
printf("\n");
}
4.利用栈判断字符串括号是否匹配
利用stack栈判断括号是否匹配,输入参数:字符串序列,字符串长度,若匹配输出YES,否则输出NO,末尾换行
//算法:用一个while循环和一个switch语句使字符串若是左括号进栈,先确保左括号全部进栈,若是右括号,则用If语句判断是否对应的左括号与出栈的第一个括号相等,若相等,则出栈赋值,循环结束,栈空则输出YES
void Bracket_Match(T* str, int len)
{Stack* stk=Stack_Create(100);
int i=0;
char ch=str[i];
while(str[i]!='\0')
{switch(str[i])
{case'(':case'{':case'[':
Stack_Push(stk,str[i]);break;
case')':if('('==stk->data[stk->top])ch=Stack_Pop(stk);break;
case'}':if('{'==stk->data[stk->top])ch=Stack_Pop(stk);break;
case']':if('['==stk->data[stk->top])ch=Stack_Pop(stk);break;
}
i++;
}
if(Stack_IsEmpty(stk))
{printf("YES");printf("\n");}
else{printf("NO");printf("\n");}
}
5.利用栈判断字符串是否为回文串
利用stack栈判断字符串是否为回文串, 输入参数:字符串序列,字符串长度,若是回文串输出YES,否则输出NO,末尾换行
//算法:用while循环将字符串元素压入栈中,再用while循环和if语句判断出栈的元素(相当于字符串的逆序)是否与字符串的顺序的元素相同,循环结束若栈为空则YES
void Palindrome(T* str, int len)
{
Stack* stk=Stack_Create(300);
int i=0;j=0;
char ch;
while(str[i]!='\0')
{
Stack_Push(stk,str[i]);
i++;
}
while(str[j]!='\0')
{if(stk->data[stk->top]==str[j])
{ch=Stack_Pop(stk);j++;}
else break;
}
if(Stack_IsEmpty(stk))
{printf("YES");printf("\n");
}
else {printf("NO");printf("\n");}
}
5.若已知一个栈的入栈顺序是A、B、C、D,其出栈序列为P1、P2、P3、P4,则P2、P4不可能是(D,C)