4.2.4 自定义栈
栈也是一种运算受限的线性表,其特点在于仅允许在一端进行元素的插入和删除操作,最后入栈的元素最先出栈,最先入栈的元素最后出栈,即“先入后出(FIFO)”或“后入先出(LIFO)”。
使用Python列表对象提供的append()、pop()方法也可以模拟栈结构及其基本运算,但是无法限制栈的大小,并且在栈为空时尝试获取元素时会引发异常,例如:
1 >>> s = []
2 >>>
3 >>> #在尾部追加元素,模拟入栈操作
4 >>> s.append(3)
5 >>> s.append(5)
6 >>> s.append(7)
7 >>> s
8 [3, 5, 7]
9 >>>
10 >>> #在尾部弹出元素,模拟出栈操作
11 >>> s.pop()
12 7
13 >>> s
14 [3, 5]
15 >>> s.pop()
16 5
17 >>> s
18 [3]
19 >>> s.pop()
20 3
21 >>> s
22 []
23 >>> #当列表中没有元素时,仍要取元素,就会报错
24 >>> s.pop()
25 Traceback (most recent call last):
26 File "<pyshell#16>", line 1, in <module>
27 s.pop()
28 IndexError: pop from empty list
29 >>>
任务:设计自定义栈类,模拟入栈、出栈、判断栈是否为空、是否已满以及改变栈大小等操作。
1 class Stack:
2 def __init__(self,size=10):
3 self._content = [] #使用列表存放栈的元素
4 self._size = size #初始栈大小
5 self._current = 0 #栈中元素个数,初始化为0
6
7 #析构函数
8 def __del__(self):
9 del self._content
10
11 #清空栈中的元素
12 def empty(self):
13 self._content = []
14 self._current = 0
15
16 #判断栈是否为空
17 def isEmpty(self):
18 return not self._content
19
20 #设置栈的大小
21 def setSize(self,size):
22 #如果缩小栈空间,则删除指定大小之后的已有元素
23 if size < self._current:
24 for i in range(size,self._current)[::-1]:
25 del self._content[i]
26 self._current = size
27 self._size = size
28
29 #>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
30 #>>> size = 5
31 #>>> current = 8
32 #>>> list(range(size,current)[::-1])
33 #[7, 6, 5]
34
35 #判断栈是否满
36 def isFull(self):
37 return self._current == self._size
38
39 #往栈中放元素
40 def push(self,v):
41 if self._current < self._size:
42 self._content.append(v)
43 self._current += 1 #栈中元素个数加1
44 else:
45 print('Stack Full!')
46
47 #从栈中取元素
48 def pop(self):
49 if self._content:
50 self._current -= 1 #栈中元素减1
51 return self._content.pop()
52 else:
53 print('Stack is empty')
54
55 def show(self):
56 print(self._content)
57
58 def showRemainderSpace(self):
59 print('Stack can still PUSH',self._size - self._current,'elements.')
1 >>> #导入自定义的模块
2 >>> from Stack import Stack
3 >>>
4 >>> #实例化对象
5 >>> s = Stack()
6 >>>
7 >>> #测试栈是否为空
8 >>> s.isEmpty()
9 True
10 >>>
11 >>> #测试栈是否已满
12 >>> s.isFull()
13 False
14 >>>
15 >>> #元素入栈
16 >>> s.push(5)
17 >>> s.push(8)
18 >>> s.push('a')
19 >>>
20 >>> s.show()
21 [5, 8, 'a']
22 >>>
23 >>> #元素出栈
24 >>> s.pop()
25 'a'
26 >>>
27 >>> s.show()
28 [5, 8]
29 >>>
30 >>> s.push('b')
31 >>> s.push('c')
32 >>>
33 >>> #查看栈的内容
34 >>> s.show()
35 [5, 8, 'b', 'c']
36 >>>
37 >>> #查看栈还有多少空间可以用
38 >>> s.showRemainderSpace()
39 Stack can still PUSH 6 elements.
40 >>>
41 >>> #修改栈的大小
42 >>> s.setSize(3)
43 >>> s.isFull()
44 True
45 >>>
46 >>> s.setSize(5)
47 >>> s.push(5)
48 >>> s.push('d')
49 >>> s.push('dddd')
50 Stack Full!
51 >>> s.show()
52 [5, 8, 'b', 5, 'd']
53 >>>