3.3栈的应用
1.括号匹配:
问题介绍:假设有两种括号,一种圆的(),一种方的【】,嵌套的顺序是任意的。
算法思想:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。
bool Check(char *str){
stack s;
InitSatack(s);
int len = strlen(str);
for(int i=0;i<len;++i)
{
char a = str[i];
switch(a){
case'(':
case'[':
Push(s,a);
break;
case')':
if(Pop(s)!='(')) //出栈顶
return false;
break;
case']':
if(Pop(s)!=']')
return false;
break;
}
}
if(Empty(s))
return true;
else
return false;
}
2.表达式求值:
后缀表达式求值:
算法思想:从左到右描述表达式的每个数字和符号,遇到数字就进栈,符号就将处于栈顶的两个数字出栈然后跟这个字符进行运算,最后将运算结果进栈,直到最终获得结果。
例子:5 20 + 1 3 * + 14 /
1.5+20=25
2.1*3=3
3.25+3=28
4.28/14=2
return 2;
//表达式求值
bool GetElem(char *str,int data)
{
int temp =1,sum=0,x=0,x1=0,x2=0;
stack s;
InitSatack(s);
int len = strlen(str);
for(int i=0;i<len;++i)
{
while('str[i]'>=0&&'str[i]'<9&&str[i]!=" "){
sum+=temp*str[i];
Push(sum,s);
i++;
}
switch(str[i]){
case'+':
Pop(x1,s);
Pop(x2s);
Push(x1+x2,s);
break;
case'-':
Pop(x1,s);
Pop(x2s);
Push(x1-x2,s);
break;
case'*':
Pop(x1,s);
Pop(x2s);
Push(x1*x2,s);
break;
case'/':
Pop(x1,s);
Pop(x2s);
Push(x1/x2,s);
break;
}
}
data=Pop(x,s);
return true;
}
中缀转后缀:
1.按运算符优先级对所有运算符和他的运算数加括号。(原本有括号的不用加)
2.把运算符移到对应的括号后。
3.去掉括号。
递归:
要理解递归,你要先理解递归,直到你能理解递归。
如果在一个函数、过程或数据结构的定义又应用了它自身,那么这个函数、过程或数据结构称是递归定义的,简称递归。递归最重要的是递归式和递归边界。