1、用栈实现队列
详见leetcode:232. 用栈实现队列
用两个栈实现队列的功能。一个栈(stIn)用来接受入队操作,另一个栈(stOut)用来处理出队操作。
(1)入队操作:将数据加入到stIn中即可;
(2)出队操作:当stOut为空的时候,将stIn里面的数据加入到stOut中。再从stOut中弹出数据,作为出队列的数据;
(3)返回队头元素:调用出队操作,保存出队数据,再将数据存到stOut中(因为只是返回,而不出队),返回保存的数据;
(4)判断为空:判断两个栈是否为空即可。
/*
整体思路用两个栈来实现
一个栈用来做输入;一个栈用来做输出
*/
class MyQueue {
private:
stack<int> stIn; // 入栈,队尾(从这里加入数据)
stack<int> stOut; // 出栈,队头(从这里取出数据)
public:
MyQueue() {
}
// 实现入队操作
void push(int x) {
stIn.push(x);
}
// 实现出队操作
int pop() {
// 只有当stOut为空的时候,才把stIn的数据加到stOut里面
if (stOut.empty()) {
while (!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int res = stOut.top();
stOut.pop();
return res;
}
// 返回队头元素
int peek() {
int res = this->pop();
stOut.push(res);
return res;
}
// 判断为空
bool empty() {
return stIn.empty() && stOut.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();
*/
结果:
2、用队列实现栈
详见leetcode:225. 用队列实现栈
有了上面用栈实现队列的思路,这里也想用两个队列实现栈。但是仔细分析后,发现行不通。
思路:用一个队列来实现栈。当队列不为空时,每次将队列的数据除最后一个外全部取出,在重新入队列,这样就实现了先进后出。
class MyStack {
private:
queue<int> q;
public:
MyStack() {
}
// 压栈
void push(int x) {
q.push(x);
}
// 移除并返回栈顶元素
int pop() {
int size = q.size();
size--;
while (size--) {
// 将队首元素再次入队列
q.push(q.front());
// 弹出队首元素
q.pop();
}
int res = q.front();
q.pop();
return res;
}
// 返回栈顶元素
int top() {
return q.back();
}
// 判断为空
bool empty() {
return q.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();
*/