• 如何用两个栈来实现一个队列,并分析有关队列操作的运行时间。


       队列的操作主要有:入队,出队,返回队列长度,返回队首元素,判断队列是否为空。

       若用两个栈来实现,可以另其中一个栈inStack专门处理入队工作,另一个栈outStack专门处理出队工作。对于入队而言,可以直接把元素加入到inStack中,复杂度为O(1);而对于出队需要做些处理,因为队列是先入先出的,而栈是先入后出,所以输出应该反序。比如inStack接收到的元素顺序为1, 2, 3,栈顶元素是3,但出队希望让1先出。解决方法是把inStack里的元素放到outStack中,这样outStack接收到的元素顺序就是3, 2, 1了,栈顶元素就是我们想要的1,时间复杂度为O(N)。更具体地,入队直接inStack.push(元素),出队先判断outStack是否为空,若 不为空,则直接outStack.pop(),若为空,则把inStack元素导入到outStack里,再执行outStack.pop()。

       代码实现如下所示:

    #include <stack>
    #include <string>
    #include <iostream>
    #include <cassert>
    
    using namespace std;
    
    template <class T>
    class YL_Queue
    {
    public:
           void enqueue(const T &element); //入队
           T dequeue();   //出队
           T top();   //队首元素
           bool empty() const;  //判断队列是否为空
           size_t size() const;  //队列的尺寸大小
    
    
    private:
            stack<T> inStack;
            stack<T> outStack;
    };
    
    template <class T>
    void YL_Queue<T>::enqueue(const T &element)
    {
        inStack.push(element);
    }
    
    
    template <class T>
    T YL_Queue<T>::dequeue()
    {
        assert(!empty());
    
        T temp;
        if (!outStack.empty())
        {
            temp=outStack.top();
            outStack.pop();
            return temp;
        }
        else
        {
            while(!inStack.empty())
            {
                temp=inStack.top();
                inStack.pop();
                outStack.push(temp);
            }
            temp= outStack.top();
            outStack.pop();
            return temp;
        }
    }
    
    template <class T>
    T YL_Queue<T>::top()
    {
        assert(!empty());
    
        T temp;
        if (!outStack.empty())
        {
            temp=outStack.top();
            return temp;
        }
        else
        {
            while(!inStack.empty())
            {
                temp=inStack.top();
                inStack.pop();
                outStack.push(temp);
            }
            temp= outStack.top();
            return temp;
        }
    
    }
    
    
    template <class T>
    bool YL_Queue<T>::empty() const
    {
        return (size()==0);
    }
    
    template <class T>
    size_t YL_Queue<T>::size() const
    {
        return inStack.size()+outStack.size();
    }
    
    
    void main()
    {
        YL_Queue<int> myqueue;
        myqueue.enqueue(1);
        myqueue.enqueue(2);
        myqueue.enqueue(3);
        myqueue.enqueue(4);
        myqueue.enqueue(5);
        cout<<"1队列的大小为: "<<myqueue.size()<<endl;
        cout<<"1队首的元素为: "<<myqueue.top()<<endl;
        myqueue.dequeue();
        myqueue.dequeue();
        cout<<"2队列的大小为: "<<myqueue.size()<<endl;
        cout<<"2队首的元素为: "<<myqueue.top()<<endl;
        myqueue.dequeue();
        myqueue.dequeue();
        myqueue.dequeue();
        cout<<"3队列的大小为: "<<myqueue.size()<<endl;
    }
  • 相关阅读:
    .NET 环境中使用RabbitMQ
    WPF窗口模板——Style样式
    C#获取当前日期时间
    C#解析JSON字符串总结
    c#简单加密和对称加密
    List<T>转换为二维数组
    java后台导出pdf
    C# 创建 读取 更新 XML文件
    python 第三天
    编写登录接口
  • 原文地址:https://www.cnblogs.com/Trony/p/2642588.html
Copyright © 2020-2023  润新知