栈的应用-四则运算表达式

后缀(逆波兰)表示法定义:所有的符号都是在要运算数字的后面出现。

中缀表达式:a+b*c+(d*e+f)/g

后缀表达式:abc*+de*f+g/+

示例:2+3*2+(2*3+4)/2 = 13

232*+23*4+2/+ = 13

后缀表达式的运算:

  1.扫描后缀表达式: 
    ①如果是数字,则让其进栈 
    ②若为操作符,则从栈中取出两个操作数,先取出的作为右操作数,后取出的作为左操作数,然后进行该操作符的运算,并使其结果入栈。 
    ③重复上述过程,直至表达式扫描完成。 
  2.最终栈中只留一个元素—–>即就是结果。

中缀表达式转化成后缀表达式:

1.遇到操作数,直接输出;

2.栈为空时,遇到运算符,入栈;

3.遇到左括号,将其入栈;

4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;

5.遇到其他运算符“+”、“-”、“*”、“÷”时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;

6.最终将栈中的元素依次出栈,输出。 

示例:

例如将 9 + (3 - 1) X 3 + 10 / 2 转换成后缀表达式,过程如下:
  1、9是数字,输出,表达式为:9;
  2、“ + ”进栈,“ ( ”进栈,栈内容为:+ (;
  3、数字3输出,表达式为:9 3;
  4、“ - ”进栈,栈内容为:+ ( -;
  5、数字1输出,表达式为:9 3 1;
  6、遇到“ ) ”,根据规则,栈中符号出栈直到“ ( ”出栈为止,此间遇到“ - ”需要输出,因此表达式为:9 3 1 -,栈中内容为:+;
  7、遇到“ X ”,由于它的优先级比栈顶元素“ + ”高,因此它进栈,栈中内容为:+ X;
  8、遇到数字3输出,表达式为:9 3 1 - 3;
  9、之后是“ + ”,优先级比栈顶的“ X ”低,“ X ”出栈输出,“ + ”变成栈顶,栈顶的“ + ”优先级并不大于外面的“ + ”,因此也需要出栈输出,此时栈为空了,那么表达式为:9 3 1 - 3 X +,同时外面的“ + ”进栈,栈中内容为:+;
  10、遇到10输出,表达式为:9 3 1 - 3 X + 10;
  11、遇到符号“ / ”,优先级比栈顶元素“ + ”高,进栈,栈中内容为:+ /;
  12、数字2输出,表达式为:9 3 1 - 3 X + 10 2;
  13、遍历结束,栈不为空,栈中符号依次出栈输出,最后表达式为:9 3 1 - 3 X + 10 2 / +。

猜你喜欢

转载自www.cnblogs.com/value-code/p/9501381.html