1.用栈实现队列
文章讲解: 代码随想录
代码:
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
if(stOut.empty()){ // 当出栈为空时,将入栈的数据全部导入
while(!stIn.empty()){
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
int peek() {
int res = this->pop(); // 调用已有的push函数
stOut.push(res);
return res;
}
bool empty() {
return stIn.empty()&&stOut.empty();
}
};
思路·:用两个栈来模拟,一个入栈,一个出栈。在pop时,如果出栈为空,先把入栈的所有元素导入到出栈里,再将出栈的元素弹出(必须这样,不然就操作了空栈;再出栈不为空的情况下导入,则会使得弹出的元素顺序不对)
2.用队列实现栈
题目链接/文章讲解/视频讲解: 代码随想录
代码:
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();
}
};
思路:
用一个队列就可以模拟。pop时,把前size-1个元素先重新加入到队尾后,再弹出就可以了。
这两道题都是弹出的函数复杂一点,第一道题在出栈为空时,及时把入栈的元素全部导入比较重要;后一道题就是,要先对前size-1个元素做处理。