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

    题目

    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能

    解题思路

      一个队列包含了两个栈stack1和stack2,因此这道题的意图是要求我们操作这两个“先进后出”的栈实现一个“先进先出”的队列CQueue。对于两个栈而言,对于插入操作,不妨假设都先插入到stack1,也就实现了入队操作。但是出队操作,则需要借助stack2的过渡:

      当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。如果stack2为空时,我们把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压到stack1的底端,经过弹出和压入之后就处于stack2的顶端了,又可以直接弹出。下图展示了一个使用两个栈实现队列的实

    #include <iostream>
    #include <stack>
    #include <stdexcept>
    using namespace std;
    
    template <typename T>
    class Q
    {
        public:
            void push(int a[],int len);
            void pop();
        private:
            stack<T> s1,s2;
    };
    template <typename T>
    void Q<T>::push(int a[],int len)
    {
        for(int i=0;i<len;++i)
            s1.push(a[i]);
    }
    template <typename T>
    void Q<T>::pop()
    {
        if(s2.empty())
        {
            while(!s1.empty())
            {
                T &t=s1.top();
                s2.push(t);
                s1.pop();
            }
        }
        if(s2.empty())
        {
            logic_error ex("queue is empty");
            throw exception(ex);
        }
        cout<<s2.top()<<endl;
        s2.pop();
    }
    int main()
    {
        Q<int> q;
        int a[] ={1,2,3,4,5,6};
        q.push(a,sizeof(a)/sizeof(a[0]));
        q.pop();
        return 0;
    }
  • 相关阅读:
    什么是模板缓冲(Stencil Buffer)
    linux的source命令
    设置屏幕不被锁屏
    【转】OpenGL ES EGL & TLS(线程局部存储) & G3D
    [转]OpenGL混色介绍
    【转】Android 启动过程汇总
    Analyzing the memory usage of your Android application
    【转】EGL接口介绍(转)
    Android 核心分析(13) Android GWES之Android窗口治理
    /dev/zero和/dev/null的区别
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10133795.html
Copyright © 2011-2022 走看看