Skip to content

Commit 7a2b315

Browse files
committed
添加说明和完善注释
1 parent 12348ce commit 7a2b315

2 files changed

Lines changed: 60 additions & 0 deletions

File tree

README.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
## 栈的设计思路
2+
3+
对于 "65+1-5*" 这一字符串的解析来看"栈"的变化
4+
5+
| | | | + | | - | | * | |
6+
| --- | --- | --- | --- | --- | --- | --- | --- | ---- |
7+
| | | | | | | | | 栈顶 |
8+
| | | 5 | | 1 | | 5 | | |
9+
| | 6 | 6 | 11 | 11 | 10 | 10 | 50 | |
10+
| | | | | | | | | 栈底 |
11+
12+
* 把“栈”看成一个数组,于是我们初始化一个数组变量:
13+
```
14+
stack=[]
15+
```
16+
* 变量`stack`就是栈最初始的状态,里面没任何东西(元素)。
17+
* 循环依次得到`"65+1-5*"`的每一个字符,第一次得到`'6'`
18+
* 我们判断字符是一个数,那么就将其入栈,等效操作就是将数组变量`stack`添加一个元素:
19+
```
20+
stack.append('6') #实际编程时括号中的'6'应该写成某个变量
21+
```
22+
* 于是现在栈的状态(变量stack的值)就是:
23+
```
24+
['6']
25+
```
26+
* 再接着循环一次栈就变成:
27+
```
28+
['6','5']
29+
```
30+
* 循环到第三次我们拿到了'+',这不是一个数,而是一个运算符,我们不应该再进栈了,而是要从栈里取出两个元素来运算。注意python中数组的pop方法只是删除数组的最后一个元素,并不能完整实现出栈操作,我们要使用一点技巧
31+
```
32+
a1 = stack[-1] #取得数组的最后一个元素
33+
stack.pop() #删除数组的最后一个元素
34+
```
35+
* 现在栈的内容就变成:
36+
```
37+
['6']
38+
```
39+
* 再出栈一次:
40+
```
41+
a2 = stack[-1] #取得数组的最后一个元素
42+
stack.pop() #删除数组的最后一个元素
43+
```
44+
* 注意,第二次出栈的内容我们保存在变量'a2'中。现在栈是空的了。
45+
* 我们现在有了`a1`,`a2``'+'`,我们可以把它们组合成一个数学表达式字符串:
46+
```
47+
string = a2 + '+' + a1 #想想看我为什么把'a2'写在前面
48+
```
49+
* 现在`string`里就有一个字符串`"6+5"`
50+
* 是时候使用`eval`方法了:
51+
```
52+
a3 = eval(string)
53+
```
54+
* `eval`会计算字符串中的表达式,并返回计算结果,所以现在`a3=11`,我们把`a3`入栈,然后栈应该是这样的:
55+
```
56+
[11] #这里有个小问题,为保持一致性,栈内容其实应该是['11'],想想怎么改正?
57+
```
58+
59+
### 好了就写到这里,不能说得再多了

stack.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def length(self):
4040
# 将a2,c,a1拼接成字符串表达式,并用eval方法计算这个表达式,结果存入result
4141
result = eval(a2+c+a1)
4242
print(a2, c, a1, '=', result)
43+
# result入栈前用str方法装成字符串
4344
stack.push(str(result))
4445
print(stack.pop())
4546
# 如果栈不为空(栈里还有内容)则报错

0 commit comments

Comments
 (0)