首页 > 技术文章 > 4.2.4 自定义栈

avention 2018-03-29 15:36 原文

  栈也是一种运算受限的线性表,其特点在于仅允许在一端进行元素的插入和删除操作,最后入栈的元素最先出栈,最先入栈的元素最后出栈,即“先入后出(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 >>> 

 

推荐阅读