232.用栈实现队列
定义两个栈s1(输入栈)和s2(输出栈)
获取队首的操作:
如果输出栈空的话,把输入栈依次弹出,再放入s2中,这个时候s2的栈顶就是原栈的最后一个元素,即队列的第一个元素。
如果输出栈不为空,直接从输出栈获取栈顶即可。
class MyQueue {
public:
stack<int> s1,s2;
MyQueue() {
}
void push(int x) {
s1.push(x);
}
int pop() {
if(s2.empty()){
while(!s1.empty()){
int t = s1.top();
s1.pop();
s2.push(t);
}
}
int res = s2.top();
s2.pop();
return res;
}
int peek() {
if(!s2.empty()) return s2.top();
else{
while(!s1.empty()){
int t = s1.top();
s1.pop();
s2.push(t);
}
return s2.top();
}
}
bool empty() {
return s1.empty() && s2.empty();
}
};
/**
* 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();
*/
225.用队列实现栈
获取栈顶的操作:
定义两个队列s1,s2
压入栈即是放入队列s1,弹出栈顶就是把s1中的元素依次从队首弹出放入s2,直到剩下一个元素,该元素就是逻辑上的栈顶,把它弹出返回即可。
最后的时候s1是空的,s2则是保留着s1的剩余元素,把s2复制给s1,然后清空s2即可。
class MyStack {
public:
queue<int> s1,s2;
MyStack() {
}
void push(int x) {
s1.push(x);
}
int pop() {
// 队列剩下一个元素为栈顶
int size = s1.size() - 1;
while(size--){
int front = s1.front();
s2.push(front);
s1.pop();
}
int t = s1.front();
s1.pop();
// 将s2的内容赋值到s1
s1 = s2;
// s2只是清空自己的内容
while(!s2.empty()){
s2.pop();
}
return t;
}
int top() {
return s1.back();
}
bool empty() {
return s1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/