zoukankan      html  css  js  c++  java
  • 用两个栈实现队列

    用两个栈实现队列。队列声明如下,请实现它的两个函数append_tail和delete_head在队列的队尾添加数据和删除队头 

    class Queue_by_stack
    {
        public:
            Queue_by_stack(){};
            ~Queue_by_stack(){};
            void append_tail(const T& node);
            T delete_head();
            void Show_Queue(void); //从队首到队尾依次输出队列数据
        protected:
        private:
            stack<T> stack1;
            stack<T> stack2;
    };

    分析:队列的特性是先进后出,比如对于1,2,3,4序列来说,首先将序列压入栈(stack1和stack2随便选一个),要实现delete_head的话,不能对stack1进行pop,因为这时stack1的top值是4,我们要删除的是1,注意这时候stack2还没有利用,如果我将stack1里的数据都逐个pop,push进去stack2,对于stack2;来说,那不就正好相当于原序列吗?实现delete_head的话只需对stack2进行pop就行了,append_tail的话只需往空的stack1里面push就行了。代码实现如下 

    #include <stack>
    #include <iostream>
    using namespace std;
    template<typename T>
    class Queue_by_stack
    {
        public:
            Queue_by_stack(){};
            ~Queue_by_stack(){};
            void append_tail(const T& node);
            T delete_head();
            void Show_Queue(void); //从队首到队尾依次输出队列数据
        protected:
        private:
            stack<T> stack1;
            stack<T> stack2;
    };
    template<typename T>
    void Queue_by_stack<T>::Show_Queue(void)
    {
        T tmp;
        stack<T>  S1(stack1); // 将stack1的数据copy到S1
        stack<T>  S2(stack2);
        cout<<"
    This is Show_Queue !
    ";
        while(!S2.empty())  //先把S2中的所有数据清仓输出
        {
            cout<<S2.top()<<"  ";
            S2.pop();
        }
        while(!S1.empty()) //再把S1中的数据全部倒进S2
        {
                tmp = S1.top();
                S2.push(tmp);
                S1.pop();
        }
        while(!S2.empty())//再把S2中的所有数据清仓输出
        {
            cout<<S2.top()<<"  ";
            S2.pop();
        }
    
    }
    
    template<typename T>
    T Queue_by_stack<T>::delete_head()
    {
        T tmp;
        if (stack2.empty())  //删除元素  先判断栈2是否为空
        {
            while (!stack1.empty())  //栈2为空栈,把栈1中的数据全部倒入栈2
            {
                tmp = stack1.top();
                stack2.push(tmp);
                stack1.pop();
            }
        }
        if (stack2.empty()) //栈2仍为空,说明队列为空
        {
            return -1;
        }
        tmp = stack2.top();//如果栈2 不空的情况下,则栈2的栈顶就是队列的队首
        stack2.pop();
        return tmp;
    }
    template<typename T>
    void Queue_by_stack<T>::append_tail( const T& node )
    {
        stack1.push(node);
    }
    int main()
    {
        Queue_by_stack<char> my_queue;
        my_queue.append_tail('a');
        my_queue.append_tail('b');
        my_queue.append_tail('c');
        my_queue.Show_Queue();
    
    
        my_queue.delete_head();
        my_queue.delete_head();
        my_queue.Show_Queue();
    
        my_queue.append_tail('d');
        my_queue.append_tail('e');
        my_queue.Show_Queue();
    
        my_queue.delete_head();
        my_queue.Show_Queue();
    }
    /**********************************
    入栈顺序是 a b c d e
    运行结果:
    
    This is Show_Queue !
    a  b  c
    This is Show_Queue !
    c
    This is Show_Queue !
    c  d  e
    This is Show_Queue !
    d  e
    ***********************************/
    


  • 相关阅读:
    SAS 数据集生成map 文件
    尝试打开或创建物理文件 REATE FILE 遇到操作系统错误 5(拒绝访问)
    sas编程-日期相差计算函数 intnx
    msqlserver 千万级别单表数据去掉重复记录使用临时表
    bootstrap下使用模态框,在模态框内输入框中回车时,模态框自动关闭的问题及解决方法
    .net 环境下get 获取页面出现乱码问题解决
    关于富文本编辑框与纯文本编辑框初始化加载过程的问题
    SVN版本问题:svn: E155021: This client is too old to work with the working copy at
    new一个对象时,会经历哪些步骤
    var、let、const区别
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3233839.html
Copyright © 2011-2022 走看看