对于 "65+1-5*" 这一字符串的解析来看"栈"的变化
| + | - | * | ||||||
|---|---|---|---|---|---|---|---|---|
| 栈顶 | ||||||||
| 5 | 1 | 5 | ||||||
| 6 | 6 | 11 | 11 | 10 | 10 | 50 | ||
| 栈底 |
- 把“栈”看成一个数组,于是我们初始化一个数组变量:
stack=[]
- 变量
stack就是栈最初始的状态,里面没任何东西(元素)。 - 循环依次得到
"65+1-5*"的每一个字符,第一次得到'6'。 - 我们判断字符是一个数,那么就将其入栈,等效操作就是将数组变量
stack添加一个元素:
stack.append('6') #实际编程时括号中的'6'应该写成某个变量
- 于是现在栈的状态(变量stack的值)就是:
['6']
- 再接着循环一次栈就变成:
['6','5']
- 循环到第三次我们拿到了'+',这不是一个数,而是一个运算符,我们不应该再进栈了,而是要从栈里取出两个元素来运算。注意python中数组的pop方法只是删除数组的最后一个元素,并不能完整实现出栈操作,我们要使用一点技巧
a1 = stack[-1] #取得数组的最后一个元素
stack.pop() #删除数组的最后一个元素
- 现在栈的内容就变成:
['6']
- 再出栈一次:
a2 = stack[-1] #取得数组的最后一个元素
stack.pop() #删除数组的最后一个元素
- 注意,第二次出栈的内容我们保存在变量'a2'中。现在栈是空的了。
- 我们现在有了
a1,a2和'+',我们可以把它们组合成一个数学表达式字符串:
string = a2 + '+' + a1 #想想看我为什么把'a2'写在前面
- 现在
string里就有一个字符串"6+5" - 是时候使用
eval方法了:
a3 = eval(string)
eval会计算字符串中的表达式,并返回计算结果,所以现在a3=11,我们把a3入栈,然后栈应该是这样的:
[11] #这里有个小问题,为保持一致性,栈内容其实应该是['11'],想想怎么改正?