用两个栈实现一个队列。 appendTail 在队列尾部插入整数 daleteHead 在队列头部删除整数,没有元素,返回-1
我的思路:主要在stack1中存储,stack2用来辅助,插入元素就不说了,删除元素时,将stack1的 元素pop进stack2中,删除之后,再pop回去。
class CQueue:
def __init__(self):
self.stack1 = [] #以1为主
self.stack2 = [] #2辅助变换
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
#边界条件
if self.stack1 == []: #没有元素,返回-1
return -1
if len(self.stack1) == 1: #只有一个元素,直接pop即可
return self.stack1.pop()
#1.将stack1的元素pop到stack2,直到最后一个,
while len(self.stack1) != 1:
self.stack2.append(self.stack1.pop())
result = self.stack1.pop()
#2.将stack2的元素pop进stack1
while self.stack2 != []:
self.stack1.append(self.stack2.pop())
return result
显然,反复的存取元素使得效率特别低。
看了官方的讲解,再写一遍:
class CQueue:
def __init__(self):
self.stack1 = [] #主要用来插入操作
self.stack2 = [] #主要用来删除操作
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
#边界条件
if self.stack1 == [] and self.stack2 == []: #没有元素,返回-1
return -1
#1.查看stack2是否为空,为空则将stack1的元素pop,再pop顶部元素;
# 不为空,则直接pop
if self.stack2 != []:
return self.stack2.pop()
else:
while self.stack1 != []:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
这次快多了 ,
要注意的就是在将stack1元素pop进stack2时,先全部pop过去,再从stack2弹出顶部元素。
我一开始是,计算stack1的长度为1时停止循环,从stack1中弹出的,就慢了一点。