232. 用栈实现队列
题目链接:力扣
思路:模拟
设置一个输入栈,一个输出栈,push时正常放入输入栈。
输出时,先pop输出栈的元素,若输出栈已清空,再把输入栈中全部元素放入输出栈。
注意,输出栈清空了后,才能从输入栈放新元素进来!!否则后进的就先出了。
class MyQueue:
def __init__(self):
self.stackOut = []
self.stackIn = []
def push(self, x: int) -> None:
self.stackIn.append(x)
def pop(self) -> int:
if self.empty():
return None
if self.stackOut: # 输出栈有元素,直接输出栈顶元素
return self.stackOut.pop()
# 输出栈无元素,把输入栈中的元素全部压入输出栈(同时清空输入栈),再通过输出栈输出
else:
for i in range(len(self.stackIn)):
self.stackOut.append(self.stackIn.pop())
return self.stackOut.pop()
def peek(self) -> int: # 本质就是pop后再加回去
ans = self.pop()
self.stackOut.append(ans)
return ans
def empty(self) -> bool:
if self.stackOut == [] and self.stackIn == []:
return True
return False
225. 用队列实现栈
题目链接:力扣
思路:模拟
一个队列,一个辅助队列。
需要添加元素时,往que1里push。
需要删除元素时,把que1内除了第一个元素(最近加入的、需要删除的元素),全部push到辅助队列,删除该元素,再把辅助队列的元素push到原队列中。
辅助队列只是起一个暂存的作用。
class MyStack {
public:
queue<int> que1;
queue<int> que2; // 辅助队列,用来备份
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int size = que1.size();
size--;
while(size--){
que2.push(que1.front());
que1.pop();
}
int res = que1.front();
que1.pop();
que1 = que2;
while(!que2.empty()){
que2.pop();
}
return res;
}
int top() {
return que1.back();
}
bool empty() {
return que1.empty();
}
};
一个队列也完全可以实现,在需要删除模拟栈顶元素时,直接把length - 1个队尾元素删除后重新入队即可,这样再删除对尾元素,就是模拟栈的栈顶元素了