3.3栈的应用举例
Q1:设计一个算法判断合法的I(进栈)/O(出栈序列)
//Q1
for(i = 0;i < n;i++) { //遍历str的所有字符
if(str[i] == 'I') //为'I'时进栈
Push(st,str[i]);
else if(str[i] == 'O') //为'O'时出栈
if(!Pop(st,x)) {//若栈下溢出,则返回0
DestrpyStack(st);
return 0;
}
}
if(StackEmpty(st)) {DestroyStack(st); return 1;}//栈为空时返回1,否则返回0
else {DestroyStack(st);return 0;}
Q2:判断回文串
//
int Palindrome(char str[],int n) {
SqStack st; //定义一个顺序栈
InitStack(st); //栈初始化
int i;
char ch;
for(i = 0;i < n;i++) //所有字符依次进栈
Push(st,str[i]);
i = 0;//从头开始遍历str
while(!StackEmpty(st)) {//栈不空循环
Pop(st,ch);//出栈元素ch
if(ch != str[i++])//两字符不同时返回0
return 0;
}
return 1;//所有相应字符都相同时返回1
}
Q3:括号匹配
//
#include"SqStack.cpp"
int Match(char exp[],int n) {
SqStack st;
InitStack(st);
int flag = 1,i = 0;
char ch;
while(i < n && flag == 1) {
switch(exp[i]) {
case '(':case '[':case '{':
Push(st,exp[i]);break;
case ')':
if(!Pop(st,ch) || ch != '(')
flag = 0;
break;
case ']':
if(!Pop(st,ch) || ch != '[')
flag = 0;
break;
case '}':
if(!Pop(st,ch) || ch != '{')
flag = 0;
break;
}
i++;
}
}
//
#include"SqStack.cpp"//包含前面的顺序栈基本运算函数
int Match(char exp[],int n) {//exp存放表达式
SqStack st;//定义一个顺序栈st
InitStack(st);//栈初始化
int flag = 1,i = 0;
char ch;
while(i < n && flag == 1) {//遍历表达式exp
switch(exp[i]) {
case '(':case '[':case '{'://各种左括号进栈
Push(st,exp[i]);break;
case ')'://判断栈顶是否为'('
if(!Pop(st,ch) || ch != '(')//出栈操作失败或不匹配
flag = 0;
break;
case ']'://判断栈顶是否为'['
if(!Pop(st,ch) || ch != '[')//出栈操作失败或不匹配
flag = 0;
break;
case '}'://判断栈顶是否为'{'
if(!Pop(st,ch) || ch != '{')//出栈操作失败或不匹配
flag = 0;
break;
}
i++;
}
if(StackEmpty(st) && flag == 1) //栈空且符号匹配则返回1
return 1;
else return 0;//否则返回0
}