【Leetcode】232. 用栈实现队列
题目
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
- void push(int x) 将元素 x 推到队列的末尾
- int pop() 从队列的开头移除并返回元素
- int peek() 返回队列开头的元素
- boolean empty() 如果队列为空,返回 true ;否则,返回 false
思路
- 进栈操作:数据直接放入输入栈即可
- 出栈操作: 如果输出栈为空,那么直接将输入栈中的所有数据全部送进输出栈,然后在出栈,达到先进先出的目的,如果输出栈不为空,先将输出栈中的数据全部弹出,然后进行如上操作
- 栈空:输入栈和输出栈都没有数据。
代码
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();
stOut.push(res);// 因为pop函数弹出了元素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();
*/