QueueWithTwoStacks

用两个栈实现队列的push() 和 pop()

#include <iostream>
#include <stack>
#include <stdexcept>
using namespace std;

template <class T>
class CQueue
{
    public:
      CQueue() {};
      ~CQueue() {};

      void appendTail(const T& node);
      T deleteHead();

    private:
      stack<T> stack1;
      stack<T> stack2;
};

template <class T>
void CQueue<T>::appendTail(const T& node)
{
    stack1.push(node);
}

template <class T>
T CQueue<T>::deleteHead()
{
    if (stack2.empty())
    {
        while (!stack1.empty())
        {
            T& tmp = stack1.top();
            stack1.pop();
            stack2.push(tmp);
        }

    }
        if (stack2.empty())
        {
            throw runtime_error(" queue is empty");
        }

        T head = stack2.top();
        stack2.pop();

        return head;
}    

void  Test(int actual, int excepted)
{
    if (actual == excepted)
        cout << "Test passed.\n";
    else
        cout << "Test failed.\n";
}

int main()
{
   try {
    CQueue<int> queue;
    queue.appendTail(1);
    queue.appendTail(2);
    queue.appendTail(3);

    int head = queue.deleteHead();
    Test(head,1);

    head = queue.deleteHead();
    Test(head,2);

    queue.appendTail(4);
    head = queue.deleteHead();
    Test(head,3);

    queue.appendTail(5);
    head = queue.deleteHead();
    Test(head,4);

    head = queue.deleteHead();
    Test(head,5);
   }

   catch (runtime_error err) {
        cout << err.what() << endl;
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:06:10

QueueWithTwoStacks的相关文章

算法Sedgewick第四版-第1章基础-022一QueueWithTwoStacks

1 /****************************************************************************** 2 * Compilation: javac QueueWithTwoStacks.java 3 * Execution: java QueueWithTwoStacks < input.txt 4 * Dependencies: StdIn.java StdOut.java 5 * Data files: http://algs4.

如何用两个栈实现一个队列

在数据结构中,我们都学习过队列和栈,我们知道栈的基本特征是后进先出,这个当然也很好理解,用一句歇后语给大家通俗得解释一下,就是: 砌墙的砖瓦--后来居上.很容易明白,就是后面来的反倒在最上面,当然你取的话,是不是得从最上面开始取呀,很容易明白的.再来说说队列,队列的特征是先进先出,就是说先来的先走,生活中的例子就是排队买票,这个大家都很熟悉了,就是先买到票的人先走,后买到票的人后走. 接下来就进入我们今天的主题,即如何用栈来实现队列? 在这里我们可以通过两个栈来操作.第一个栈中存放入队列的元素,

【Java】 剑指offer(8) 用两个栈实现队列

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集  题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路 这道题较简单,自己先试着模拟一下插入删除的过程(在草稿纸上动手画一下):插入肯定是往一个栈stack1中一直插入:删除时,直接出栈无法实现队列的先进先出规则,这时需要将元素从stack1出栈,压到另一个栈stack2

Python后端技术栈(二)

每日分享 Darkness cannot drive out darkness; only light can do that. Hate cannot drive out hate; only love can do that. 黑暗无法驱除黑暗; 只有光可以做到这一点. 仇恨无法驱走仇恨; 只有爱才能做到这一点. 小闫笔记: 不知你苦难,无法劝你向善.但你要知道,爱会让你过的更轻松.最后送给大家泰戈尔的<飞鸟集>中的一句『世界以痛吻我,我要回报以歌』. 1.2算法与数据结构 上篇文章对本系