大话数据结构第四章:栈与队列;栈、队列以及链表同属线性表。
栈:先进后出;因此栈是只允许在表尾进行插入和删除的。进指压栈,出指弹栈。
队列:先进先出,与排队一样,先进先出,先到先得。
1. 栈
1.1 栈
栈是限定仅在表尾进行插入和删除操作的线性表,我们把允许进行操作的一段称为栈顶,另一端称为栈底。不含任意元素的栈称为空栈。
栈的插入操作叫做进栈,栈的删除操作称为出栈。值得注意的是:并非所有元素全部进栈之后元素才能出栈。比如1,2,3三个元素依次入栈,那么出栈的顺序可能会有哪些呢?
1. 1,2,3进; 然后3,2,1出 2. 1进1出; 2进2出; 3进3出 3. 1进2进; 2出; 3进; 3出; 1出 4. 1进2进; 2出; 1出; 3进; 3出 5. 1进1出; 2进3进; 3出2出
1.2 栈的Python实现
# -*- coding: utf-8 -*- class Stack: def __init__(self, length): self.length = length self.top = -1 self.data = [] def push(self, ele): """ 压栈 """ if self._isfull(): raise(Exception("The stack is full.")) else: self.data.append(ele) self.top += 1 def pop(self): """ 弹栈 """ if self._isEmpty(): raise(Exception("The stack is empty.")) else: self.data = self.data[:-1] self.top -= 1 def display(self): """ 打印栈中的所有元素 """ print("\n当前栈中的元素有: {0}".format(self.data)) def _isfull(self): """ 判断是否满栈 """ if self.top >= self.length - 1: return True else: return False def _isEmpty(self): """ 判断是否空栈 """ if self.top == -1: return True else: return False if __name__ == "__main__": obj = Stack(5) for i in range(10, 15): obj.push(i) obj.display() for i in range(5): obj.pop() obj.display()
1.3 栈的应用
栈最知名的应用当属递归,其次在高级计算器中进行复杂的四则混合运算也需要用栈将我们日常使用的中缀表达式转化为后缀表达式,从而能够让计算器进行四则混合运算。
# -*- coding: utf-8 -*- class Stack: def __init__(self, length): self.length = length self.top = -1 self.data = [] def push(self, ele): """ 压栈 """ if self._isfull(): raise(Exception("The stack is full.")) else: self.data.append(ele) self.top += 1 def pop(self): """ 弹栈 """ if self._isEmpty(): raise(Exception("The stack is empty.")) else: self.data = self.data[:-1] self.top -= 1 def display(self): """ 打印栈中的所有元素 """ print("\n当前栈中的元素有: {0}".format(self.data)) def _isfull(self): """ 判断是否满栈 """ if self.top >= self.length - 1: return True else: return False def _isEmpty(self): """ 判断是否空栈 """ if self.top == -1: return True else: return False if __name__ == "__main__": obj = Stack(5) for i in range(10, 15): obj.push(i) obj.display() for i in range(5): obj.pop() obj.display()
2. 队列
队列是先进先出的线性表,在队头进行删除,队尾进行插入。队列经常应用于操作系统的应用程序排队、客服系统等等。