首页 > 试题广场 >

用两个栈实现一个队列的功能?要求给出算法和思路!

[问答题]
用两个栈实现一个队列的功能?要求给出算法和思路!
推荐

设2个栈为A,B, 一开始均为空.

入队: 将新元素push入栈A; 

出队: (1)判断栈B是否为空;

 (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

 (3)将栈B的栈顶元素pop出; 

这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。


编辑于 2015-02-09 21:21:42 回复(0)
思路:
1. 入队:push进栈1
2. 出队:如果栈2为空,将栈1的内容按照出栈顺序依次push进栈2,再pop掉栈2的顶部。如果栈2非空,直接pop掉栈2顶部。
代码如下:
class Solution {
public:
    void push(int node) {
        stack1.push(node);
    }
    int pop() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        int top = stack2.top();
        stack2.pop();
        return top;
    }
private:
    stack<int> stack1;
    stack<int> stack2;
};

发表于 2016-08-05 15:01:48 回复(0)
我的方法是这样的:
栈A和栈B,栈A中的元素先进后出,每出来一个元素就压进栈B,知道栈A为空,那么最先进栈A的元素最后进入栈B,也是最先出栈B的。最后进入栈A的元素最先进入栈B,也是最后出栈B的。

发表于 2015-07-17 10:31:21 回复(0)