题目来源
题目概述
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。 int pop()
移除并返回栈顶元素。 int top()
返回栈顶元素。 boolean empty()
如果栈是空的,返回 true ;否则,返回 false 。
思路分析
由于队列是尾入头出的,而栈的出入端都是同一端,所以我们在执行push、pop中的某一个操作时,必须先把队列中的元素清空。所以我们需要两个队列,一个用来存储数据,另一个用来实现相反操作的缓存。
代码实现
java实现
public class MyStack {
Queue<Integer> queue;
Queue<Integer> temp;
public MyStack() {
queue = new LinkedList<>();
temp = new LinkedList<>();
}
public void push(int x) {
queue.add(x);
}
public int pop() {
int size = queue.size();
for (int i = 0; i < size - 1; i++){
temp.add(queue.poll());
}
int res = queue.poll();
Queue<Integer> changeTemp = queue;
queue = temp;
temp = queue;
return res;
}
public int top() {
int size = queue.size();
for (int i = 0; i < size - 1; i++){
temp.add(queue.poll());
}
int res = queue.poll();
temp.add(res);
Queue<Integer> changeTemp = queue;
queue = temp;
temp = queue;
return res;
}
public boolean empty() {
return queue.size() == 0;
}
}
c++实现
class MyStack {
private:
queue<int> q;
queue<int> temp;
public:
MyStack() { }
void push(int x) {
q.push(x);
}
int pop() {
int size = q.size();
for (int i = 0; i < size - 1; i++) {
temp.push(q.front());
q.pop();
}
int res = q.front();
q.pop();
queue<int> changeTemp = temp;
temp = q;
q = changeTemp;
return res;
}
int top() {
int size = q.size();
for (int i = 0; i < size - 1; i++) {
temp.push(q.front());
q.pop();
}
int res = q.front();
temp.push(res);
q.pop();
queue<int> changeTemp = temp;
temp = q;
q = changeTemp;
return res;
}
bool empty() {
return q.empty();
}
};