Skip to content

sqlcn/stack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

栈的设计思路

对于 "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()     #删除数组的最后一个元素

不过后来测试pop()方法可以返回被删除的元素,所以可以写成 a1=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'],想想怎么改正?

好了就写到这里,不能说得再多了

About

栈的演示

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages