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

    http://www.cnblogs.com/kaituorensheng/archive/2013/03/02/2939690.html

    //前提已知
    typedef struct queue
    {
            int queuesize;
            int head, tail;
            int *q;
    }Queue;
    
    void InitQueue(Queue *q);
    void EnQueue(Queue *q, int key);
    int DeQueue(Queue *q);
    int SizeOfQueue(Queue *q);
    int IsQueueEmpty(Queue *q);
    int IsQueueFull(Queue *q);

    思路

        q1是专职进出栈的,q2只是个中转站

    • 入栈:直接入队列q1即可
    • 出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中

    图示

       

    参考代码

    void Push(Queue *q1, Queue *q2, int k)
    {
            EnQueue(q1, k);
    }
    
    int  Pop(Queue *q1, Queue *q2)
    {
        int tmp;
        if(IsQueueEmpty(q1) == 1)
        {
           printf("Stack Empty!
    ");
        }
        else
        {
            while(SizeOfQueue(q1) != 1)
            {
                EnQueue(q2, DeQueue(q1));
            }
            tmp = DeQueue(q1);
            while(IsQueueEmpty(q2) == 0)
            {
                EnQueue(q1, DeQueue(q2));
            }
            return tmp;
        }
    }

    思路二:

    #include <iostream>
    #include <queue>
    using namespace std;
    class cStack
    {
    public:
        cStack()
        {
            count=0;
        }
        void enque(int num)//入队的实现
        {
            if(q1.size()==0&&q2.size()==0)//q1和q2为空
                q1.push(num);
            else if(q1.size()>0)//q1不为空,q1入队
                q1.push(num);
            else if(q2.size()>0)//q2不为空,q2入队
                q2.push(num);
            ++count;
        }
        int Deque()//出队的实现
        {
            int res;
            if(q2.size()==0)//q2为空
            {
                while(q1.size()!=1)//q1不为空,q1出队剩下一个元素,就是出栈的元素
                {
                    int data=q1.front();
                    q1.pop();
                    q2.push(data);
                }
                res=q1.front();
                q1.pop();
                //cout<<res<<endl;
            }
            else//q2不为空,q2出队剩下一个元素,就是出栈的元素
            {
                while(q2.size()!=1)
                {
                    int data=q2.front();
                    q2.pop();
                    q1.push(data);
                }
                res=q2.front();
                q2.pop();
               // cout<<res<<endl;
            }
            count--;
            return res;
        }
        int getNum() const
        {
            return count;
        }
    
    private:
        queue<int>q1;
        queue<int>q2;
        int count;
    };
    
    int main()
    {
        cStack s1;
        for(int i=0;i<10;i++)
            s1.enque(i);
        cout<<"栈中数的个数"<<s1.getNum()<<endl;
        for(int j=0;j<5;j++)
        {
             int data=s1.Deque();
             cout<<data<<endl;
        }
        return 0;
    }
  • 相关阅读:
    php编译错误:jpeglib.h not found.
    php编译错误:Please reinstall the libcurl distribution
    php编译错误:Cannot find OpenSSL's <evp.h>
    php shmop windows 信号量锁
    vsftpd配置
    putty ssh 证书登录及问题
    mysql被收购 用mariadb
    centos 7 php7 yum源
    3dmax 欢迎页卡住
    用python进行服务器的监控
  • 原文地址:https://www.cnblogs.com/wft1990/p/7461482.html
Copyright © 2011-2022 走看看