栈的特点是先进后出
3.1 通过栈实现的前缀,中缀,后缀表达式的计算
前缀表达式: 前缀表达式叫做波兰表达式,例如(3+2)3+4 => ++3234 符号在前所以叫前缀表达式
计算方法:从右往左遍历前缀表达式,遇到数字压入栈中,遇到符号从栈中弹出两个数将其计算后将结果压入栈中,重复操作,直到栈中只剩下最后一个数即为结果
中缀表达式: 中缀表达式就是我们人最好接受的形式:例如(3+2)*4,对于中缀表达式的计算虽然人好接受但是计算机并不容易接受,所以对于中缀表达式的计算通常转换为后缀表达式进行计算。
中缀表达式转换为后缀表达式 :
首先创建两个栈,一个符号栈operStack,一个数字栈numStack,这里的数字栈可以用一个list代替,便于后面的逆序输出,因为数字栈在这里面不做任何的pop运算,所以可以用list代替
然后遍历整个中缀表达式,遍历需要遵循如下规则
如果读取到的为字符
符号栈operStack为空,直接将字符push进去
符号栈operStack不为空,判断读取的字符和栈顶的字符优先级(括号不是字符不用管优先级),如果读取的字符优先级大于栈顶字符则直接压入,反之则将栈顶符号弹出并压入numStack中,再次判断读取的字符和栈顶字符,重复操作,直到读取字符优先级大于栈顶字符或栈为空将读取的字符压入operStack
读取到的为左括号( 直接放进operStack
读取到的为右括号 ) 一次将operStack的符号弹出压入numSatck中,直到遇到左括号为止,然后将这一对括号丢弃
如果读取的为数字
直接压入numStack中
遍历完后依次将operStack中的字符一次弹出压入numStack中
numStack顺序弹出结果的逆序即为后缀表示
后缀表达式: 后缀表达式也叫 逆波兰表达式 例如 :(3+2)* 3+4 => 32+3*4+ 符号在后所以叫后缀表达式
后缀表达式的计算:
从左往右遍历后缀表达式,遇到数字直接压入栈,遇到符号直接弹出两个数进行计算然后再次将结果压入栈中,直到最后栈中结果只剩一个。