题目描述
实现思路
我们可以将两个栈分别设置为输入栈s1、输出栈s2
需要输入(push)时,将元素放入s1
需要输出/访问栈顶(pop 或 peek)时,就从s2拿出来
stack的常用函数
- s.push(ele)-将ele放入栈(void)
- s.pop()-将栈顶元素弹出栈(void)
- s.top()-返回栈顶元素(但不弹出)
- s.empty()-返回布尔值,表示栈是否为空
- s.size()-返回栈中元素的个数
1、push
入栈操作不用多说,直接push入s1即可
2、pop
我们的目标是从队列开头移除并返回元素(即返回最早入队的元素)
首先检查s2是否为空:
若s2为空,则将s1的元素依次通过top+pop放入s2
(此时在s2栈顶的就是最早入队的元素)
若s2不为空,直接取出s2栈顶元素即可
3、peek
原理与pop完全相同,只不过不需要移除目标元素
4、empty
若s1和s2都为空,则表明队列已空
代码实现(C++)
class MyQueue {
public:
stack<int> s1; //输入栈
stack<int> s2; //输出栈
MyQueue() {}
void push(int x) {
s1.push(x);
}
int ele;
if(s2.empty()==false){
ele=s2.top();
s2.pop();
}else{
while(s1.empty()!=true){
s2.push(s1.top());
s1.pop();
}
ele=s2.top();
s2.pop();
}
return ele;
}
int peek() {
if(s2.empty()==false){
return s2.top();
}else{
while(s1.empty()!=true){
s2.push(s1.top());
s1.pop();
}
return s2.top();
}
}
bool empty() {
return s1.empty()&&s2.empty() ? true : false;
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/