题目:
实现一个类,用两个栈实现一个队列,支持队列的基本操作(add, poll, peek)
思路:
两个栈,stack_push负责接收数据,stack_pop负责弹出数据,当有新数据到来,直接进入stack_push,当要求出队列时,
1)当stack_pop为空时,将stack_push里的数据依次出栈,加入stack_pop,则stack_pop里的数据是后入栈stack_push的在上边,符合队列操作要求
比如按1,2,3顺序进入队列,则
stack_push:
3,
2,
1,
要求出队时,stack_pop为空,将stack_push里的全部数据依次弹出,压入stack_pop:
stack_pop:
1,
2,
3,
此时出队的顺序符合队列操作。
2)当stack_pop不空,则直接从stack_pop出队即可。
3)新来的数据,直接压入stack_push
代码:
class Queue:
def __init__(self):
self.push_stack = []
self.pop_stack = []
def add(self, data):
self.push_stack.append(data)
def poll(self):
if len(self.pop_stack) == 0 and len(self.push_stack) == 0:
raise Exception('Queue is empty')
if len(self.pop_stack) == 0:
while len(self.push_stack) != 0:
self.pop_stack.append(self.push_stack.pop())
return self.pop_stack.pop()
def peek(self):
if len(self.pop_stack) == 0 and len(self.push_stack) == 0:
raise Exception('Queue is empty')
if len(self.pop_stack) == 0:
while len(self.push_stack) != 0:
self.pop_stack.append(self.push_stack.pop())
return self.pop_stack[-1]
测试:
使用python的list模拟一个队列,构造若干随机操作(add, poll),同时操作实现的队列跟list模拟的队列,比较poll跟peek得到的值是否相同。
def test(times, maxnum):
q = Queue()
q0 = []
queue_size = 0
for _ in range(times):
op = random.randint(0, 1)
if op == 0 and queue_size > 0:
a = q.poll()
b = q0.pop(0)
print(a, b)
if a != b:
raise Exception('Error pop')
queue_size -= 1
else:
r = random.randint(0, maxnum)
q.add(r)
q0.append(r)
if q.peek() != q0[0]:
raise Exception('Error peek')
queue_size += 1
if __name__ == '__main__':
test(1000, 100)