• 两个队列实现栈


    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;
    }
  • 相关阅读:
    5.2 spring5源码--spring AOP源码分析三---切面源码分析
    5.2 spring5源码--spring AOP源码分析二--切面的配置方式
    在Dubbo中使用Zookeeper入门案例
    Dubbo直连方式改造
    Dubbo直连方式
    16.3.3 对矢量可执行的其它操作
    16.3.2 可对矢量(vector)执行的操作
    16.3 标准模板库
    16.2.2 有关智能指针的注意事项
    16.2.1 使用智能指针
  • 原文地址:https://www.cnblogs.com/wft1990/p/7461482.html
Copyright © 2020-2023  润新知