题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
以下为 2019.06.05 更新
class Solution
{
public:
void push(int node) {
/**
* 先考虑栈和队列的特性
* 栈: FILO 先进后出
* 队列:FIFO 先进先出
*
* push:入队列操作,我们不妨让所有的元素都入 stack1
*/
stack1.push(node);
}
int pop() {
/**
* 队列的出队操作
* 如果 stack2 非空,就出stack2 的 top, 然后 stack2.pop()
* 如果 stack2 为空,就将 stack1 的全部元素倒过来,然后继续上面的操作
*/
int temp = 0;
// 需要先判断 stack2 是否为空
// 不为空 直接出 stack2 的栈顶元素
if (!stack2.empty())
{
temp = stack2.top();
stack2.pop();
return temp;
}
else
{
// 此时 stack2 为空
// 将 stack1 的所有元素倒到 stack2
while(!stack1.empty())
{
temp = stack1.top();
stack1.pop();
stack2.push(temp);
}
// 需要再次判断 stack2 是否非空
if(!stack2.empty())
{
temp = stack2.top();
stack2.pop();
return temp;
}
else
{// stack1 和 stack2 都为空 理论上应该返回 false 的,但是函数并没有这么设计 我们返回一个 0 为敬吧
return 0;
}
}
}
private:
stack<int> stack1;
stack<int> stack2;
};
以上为 2019.06.05 更新
题解:
首先我们说一下栈和队列的特性
栈,限定性线性表,只能从栈顶压入元素(尾插),也只能从栈顶弹出元素(尾删)
队列,限定性线性表,只能从队尾入队列(尾插),只能从队头拿元素(头删)
考虑到这两个特性,题目给了我们两个栈
实现入队列操作,无论何时,都往stack1 压入元素
实现出队列操作,如果 stack2 不空,就取 stack2 栈顶元素,如果stack2 空了,就把 stack1 里全部元素导入 stack2,然后再出 stack2 的栈顶元素
这样就是可以通过用两个栈实现一个队列
下面附上代码:
代码已上传 github,可用 git 工具下载查看:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int val = 0;
if(stack2.empty())
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
val = stack2.top();
stack2.pop();
return val;
}
private:
std::stack<int> stack1;
std::stack<int> stack2;
};
如果你有更好的解决办法或者问题,欢迎留言,大家一起探讨,谢谢大家 :)