1、括号匹配
- 如果是扫描到左括号,则入栈
- 如果是扫描到右括号,则检查现在的栈顶元素,如果括号匹配,则栈顶元素出栈
- 结束时,如果栈内没有元素,则括号匹配
bool Check(char *str){stack s;InitStack(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、表达式求值
2.1 表达式转成后缀表达式
首先我们要知道怎么把我们的表达式(前缀表达式)转成后缀表达式
- 按照计算顺序加括号,每一步都加一个,如果有括号就不用加了
- 把运算符移到对应括号的后面,注意要找准运算符对应的括号,比如最后一个加号
- 去掉括号,就是我们要的后缀表达式了
2.2 求值
- 扫描后缀表达式,如果是数字入栈
- 如果是运算符,出栈两个数字,计算,再把结果入栈
- 最后的结果再出栈
比如说后缀表达式 ABCD-*+EF/-
3、递归
递归我们可以理解为先递后归两个部分,递归最重要的是递归式和递归边界
int F(int n){if(n==0) return 1; //递归边界elsereturn n*F(n-1); //递归式}
例如,求F(3)
递:
我们在调用F(3)时,调用F(2),调用F(2)后,我们要回到F(3),所以我们要把F(3)的信息压入栈中,F(2)调用F(1)也一样
归:
调用完F(0)时,我们要回到F(1),会把栈中F(1)的信息弹出来,然后回到F(1),接着把F(2)信息取出来,一次类推