力扣 232. 用栈实现队列
题目链接:232. 用栈实现队列 - 力扣(LeetCode)
思路: 栈是先进后出,而队列是先进先出,因此需要用两个栈来实现队列,一个输入栈,一个输出栈。
push操作只需要将数据放进入栈中就行了。而对于pop操作,需要先判断出栈是否为空,如果为空,将入栈中的元素push进来之后,再弹出数据。
peek函数可以复用pop代码,需要注意的是,result被pop弹出来了,因此需要重新push进栈。
C++代码:
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty()){
while(!stackIn.empty()){
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result=stackOut.top();
stackOut.pop();
return result;
}
int peek() {
int result=this->pop();
stackOut.push(result);
return result;
}
bool empty() {
return stackIn.empty() &&stackOut.empty();
}
};
力扣 225. 用队列实现栈
题目链接:225. 用队列实现栈 - 力扣(LeetCode)
思路:和上题类似,也可以使用两个队列实现栈的模拟。但是存在优化空间,就是如何使用一个队列实现?模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
C++代码:
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size=que.size();
size--;
while(size--){
que.push(que.front());
que.pop();
}
int result=que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};