剑指 05 两个栈实现队列
题目解析:
用两个栈来实现一个队列,完成n次队尾插入,队头删除。元素为int类型。插入O(n),时间复杂度O(1)。
结题思路:
插入复杂度为 O ( n ) O(n) O(n),即将一个栈作为专门的pop栈,满足队列先进先出 O ( 1 ) O(1) O(1)。将另一栈作为pop栈的中间通道,反置,插入新值,再反置。
代码:
我的代码
# -*- coding:utf-8 -*-
# 栈是先进后出
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, node):
while(len(self.stack2) !=0):
item = self.stack2.pop()
self.stack1.append(item)
self.stack2.append(node)
while (len(self.stack1) != 0):
item = self.stack1.pop()
self.stack2.append(item)
def pop(self):
item = self.stack2.pop()
return item
别人的代码:
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, node):
self.stack1.append(node)
def pop(self):
if self.stack2 != []:
return self.stack2.pop()
else:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
别人的代码中,主要想法为,只要在调用pop时,保证pop栈中有数据就行,无数据了再进行一次完整的转置。不需要每次插入都进行一次转置。这样的时间显然是更少的,虽然复杂度上一样。