用两个队列实现一个栈-创新互联

队列是先进先出,而栈是先进后出;

创新互联是一家专注于网站建设、网站制作与策划设计,河南网站建设哪家好?创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:河南等地区。河南做网站价格咨询:18980820575

考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;

由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。

由于往栈中添加元素相当于往队列头添加元素,因此我们需要在两个队列中进行元素的转移,比较简单的实现是:

1.q1和q2在任一时刻至少有一个为空,即如果有元素,所以元素只在同一个队列中。
2.当有元素需要插入时,将插入的元素插入到空的队列中,并将另一非空队列的元素转移到该队列中,于是插入的元素添加到了队列头中。

(当然,你可以换一种思路,把队列尾与栈顶对应起来,这样子需要特别处理的是pop操作以及top操作,相比起来,本文的做法更加简便,因为只需要对插入操作特别处理)

具体C++代码实现如下:

class Stack {public:    // Push element x onto stack.
    void push(int x) {        if (!q1.empty())
        {
            q2.push(x);            while (!q1.empty())
            {
                q2.push(q1.front());
                q1.pop();
            }
        }        else
        {
            q1.push(x);            while (!q2.empty())
            {
                q1.push(q2.front());
                q2.pop();
            }
        }
    }    // Removes the element on top of the stack.
    void pop() {        if (q1.empty()&&q2.empty())            throw new exception("stack is empty");        else if (!q1.empty()) q1.pop();        else q2.pop();
    }    // Get the top element.
    int top() {        if (!q1.empty()) return q1.front();        else return q2.front();
    }    // Return whether the stack is empty.
    bool empty() {        return (q1.empty()&&q2.empty());
    }private:    queue q1, q2;
};

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章题目:用两个队列实现一个栈-创新互联
URL标题:http://ybzwz.com/article/dhgcso.html