题目
(1)实现一个MyQueue类,该类用两个栈来实现一个队列。
(2)示例如下:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
(3)说明
- 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size 和 is empty 操作是合法的。
- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
- 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
解决思路
- 用两个栈s1和s2实现队列功能,s1在前,s2在后,从s2入队列,从s1出队列。
- s1和s2的排列如下图所示:
- 注意:
- python代码中用2个list模拟2个栈,实现队列功能时,要注意将元素从s2中转移到s1中时,是从s2的尾部取出然后从s1的尾部插入的。
- peek()中要返回s1[-1]而不是s1[0]。
- python中list的pop功能会返回list的最后一个值,并将该值从list中删除。
代码
- C++代码
# include <stdio.h>
# include <stack>
using namespace std;
class MyQueue {
public:
// 定义2个栈用于实现队列的功能,s1在前,s2在后。
stack<int> s1;
stack<int> s2;
MyQueue(){}
void push(int x) {
s2.push(x);
}
// 将栈s2中的所有元素转移到s1中
void transfor() {
// 如果s1不为空,则不转移
if (!s1.empty()) {
return;
}
while (!s2.empty()) {
s1.push(s2.top());
s2.pop();
}
}
int pop() {
transfor();
int ret = s1.top();
s1.pop();
return ret;
}
int peek() {
transfor();
return s1.top();
}
bool empty() {
return s1.empty() && s2.empty();
}
};
int main() {
MyQueue *queue = new MyQueue();
queue->push(1);
queue->push(2);
printf("%d\n", queue->peek());
printf("%d\n", queue->pop());
printf("%d\n", queue->empty());
return 0;
}
- Python代码
# -*- coding: utf-8 -*-
class MyQueue:
def __init__(self):
# 用2个list实现队列的功能,s1在前,s2在后,从s2入队,从s1出队。
self.s1 = []
self.s2 = []
def push(self, x: int):
self.s2.append(x)
# 将s2中的所有元素转移到s1中
def transfor(self):
if self.s1: # 如果s1不为空,则不转移
return
while self.s2:
# list的pop功能会返回list的最后一个值,并将该值从list中删除
# 注意:将元素从s2搬运到s1中时,是从s2的尾部取出,然后从s1的尾部放入的。
self.s1.append(self.s2.pop())
def pop(self):
self.transfor()
return self.s1.pop()
def peek(self):
self.transfor()
# 由于transfor中元素是从s2的尾部取出,然后从s1的尾部放入的。因此最先进入s2的元素会被放到s1的尾部
# 则第一个元素是s1[-1],因此返回s1[-1]
return self.s1[-1]
def empty(self):
return not self.s1 and not self.s2
def main():
queue = MyQueue()
queue.push(1)
queue.push(2)
print(queue.peek())
print(queue.pop())
print(queue.empty())
if __name__ == "__main__":
main()
说明
- 对应LeetCode第03.04题。
- 链接:https://leetcode-cn.com/problems/implement-queue-using-stacks-lcci/