栈
栈的特点是LIFO后进先出(last in first out)
队列
队列与栈不同,它是FIFO先进先出(first in first out)结构
用两个栈实现一个队列
这是剑指offer的第7题,用两个栈来实现一个队列,完成队列的push和pop操作。队列中的元素为int类型。
思路
对于两个栈s1和s2,始终用s1作为存储空间,以s2为临时缓冲区。
- 入队时,将元素直接压入s1.
- 出队时,将s1中的元素逐个弹出并压入s2,将s2的top元素弹出作为出队元素,之后再将s2中剩下的元素逐个弹出并压入s1。
对于这个思路来说,其实有一个小细节可以优化,在出队时,将s1的元素逐个弹出并压入s2时,在s1栈底的那个元素不需要倒入s2,可以直接弹出作为出队元素。这样可以减少一次压栈操作。
实现
# -*- coding:utf-8 -*-
class Solution:
# 思路:
# 始终用s1作为存储空间, s2作为临时缓冲区
# 入队时,将元素压入s1
# 出队时,将s1中的元素逐个弹出并压入s2,将s2顶部元素弹出作为出对元素,再将s2中的元素弹出并压入s1
def __init__(self):
self.s1 = []
self.s2 = []
def push(self, node):
# write code here
self.s1.append(node)
def pop(self):
# return xx
while len(self.s1)!=0:
self.s2.append(self.s1.pop())
pop_item = self.s2.pop()
while len(self.s2)!=0:
self.s1.append(self.s2.pop())
return pop_item
# test
sol = Solution()
sol.push(1)
print(sol.s1)
sol.push(2)
print(sol.s1)
sol.push(3)
print(sol.s1)
sol.pop()
print(sol.s1)
sol.pop()
print(sol.s1)
sol.push(4)
print(sol.s1)
sol.pop()
print(sol.s1)
sol.push(5)
print(sol.s1)
sol.pop()
print(sol.s1)
sol.pop()
print(sol.s1)
下面是测试结果
可以看到用两个栈实现了队列的先入先出的功能。