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

    问题:能否用队列实现栈?

    问题分析:本质为,用队列先进先出的特性实现栈后进先出的特性。

     

     QueueToStack.h

    #include <iostream>
    #include "linkstack.h"
    #include "LinkQueue.h"
    
    using namespace std;
    using namespace DTLib;
    
    template <typename T>
    class QueueToStack : public Stack<T>
    {
    protected:
        LinkQueue<T> m_queue_1;
        LinkQueue<T> m_queue_2;
        LinkQueue<T>* m_pIn;
        LinkQueue<T>* m_pOut;
    
        void move() const   //O(n)
        {
            int n = m_pIn->length() - 1;
            for(int i=0; i<n; i++)
            {
                m_pOut->add(m_pIn->front());
                m_pIn->remove();
            }
        }
    
        void swap()
        {
            LinkQueue<T>* temp = NULL;
            temp = m_pIn;
            m_pIn = m_pOut;
            m_pOut = temp;
        }
    public:
        QueueToStack()
        {
            m_pIn = &m_queue_1;
            m_pOut = &m_queue_2;
        }
        void push(const T& e)  //O(1)
        {
            m_pIn->add(e);
        }
        void pop()   //O(n)
        {
            if(m_pIn->length() > 0)
            {
                move(); //转移数据元素
                m_pIn->remove();
                swap();
            }
            else
            {
                THROW_EXCEPTION(InvalidOperationException,"No element in the current queue...");
            }
        }
        T top() const   //O(n)
        {
            if(m_pIn->length() > 0)
            {
                move(); //将队列中的n-1个元素进行转移
                return m_pIn->front(); //因为已经将n-1个数据元素进行了转移,因此队列中还剩一个数据元素,即队头元素,也是最后入队列的元素。
            }
            else
            {
                THROW_EXCEPTION(InvalidOperationException,"No element in the current queue...");
            }
        }
        void clear()   //O(n)
        {
            m_queue_1.clear();
            m_queue_2.clear();
        }
        int size() const   //O(1)
        {
            return m_queue_1.length() + m_queue_2.length();
        }
    
    };
    int main()
    {
        QueueToStack<int> qts;
        for(int i =0; i<10; i++)
        {
            qts.push(i);
        }
    
        while(qts.size() > 0)
        {
            cout << qts.top() << endl;
            qts.pop();
        }
        return 0;
    }

     通过上面的打印结果,可以看出可以用队列实现栈的后进先出的特性。

    栈的关键操作,时间复杂度非常差。通过这个例子仅仅是为了加强对栈和队列的理解,后进先出和先进先出是可以相互转换的。

  • 相关阅读:
    asp.net编程基础
    http://blog.csdn.net/pjw100/article/details/5261582
    英雄无敌3版的仙剑奇侠传
    另类DATAGRID数据编辑修改
    使用INDY组件发送邮件,DEMO程序没有讲到的一些内容.如邮件格式定议
    .net 简单实现MD5
    VB.NET 对于类型的传递按值或者按引用
    Start with Database Connection Pool 连接管理
    ASP页面之间传值
    正则表达式
  • 原文地址:https://www.cnblogs.com/-glb/p/13258094.html
Copyright © 2011-2022 走看看