该算法推广自两个栈实现队列(算法7)。
问题:使用两个队列实现栈。
原理:
队列具有自身对称性。怎么理解?例如,你把一字符串按顺序把每个字符放到队列中,然后取出队列中的所有字符组合成新的字符串,该新字符串和旧的字符串相等。这样我们可以把队列看作是一个容器。如果有两个这样的队列queue1和queue2做容器,那么栈的操作过程如下:
(1)压栈:把元素加入到队列queue1中
(2)出栈:1. queue1为空,把其作为容器保存queue2的元素,保存过程中把queue2的最后一个元素弹出栈;2.queue2为空的情况一样。3.如果两对立均为空,栈为空。
实现:
队列的简单实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Queue:
def __init__(self): self._q = []
def empty(self): return len(self._q) == 0
def push(self, item): self._q.append(item)
def get(self): item = self._q[0] del self._q[0] return item
|
使用两个队列实现栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Stack:
def __init__(self): self._q1 = Queue() self._q2 = Queue() self._top = None
def empty(self): return self._q1.empty() and self._q1.empty()
def push(self, item): self._q1.push(item) self._top = item
def pop(self): if self._q1.empty(): while not self._q2.empty(): item = self._q2.get() if self._q2.empty(): return item else: self._q1.push(item) self._top = item else: while not self._q1.empty(): item = self._q1.get() if self._q1.empty(): return item else: self._q2.push(item) self._top = item
def top(self): if self.empty(): return None return self._top
|
为了能快速(常数时间内)返回栈顶元素,我们使用_top
变量来保存每次弹出和压栈后的栈顶元素。