两个队列实现栈

Posted 泡面小王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个队列实现栈相关的知识,希望对你有一定的参考价值。

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!\\n");
    }
    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;
}

 

以上是关于两个队列实现栈的主要内容,如果未能解决你的问题,请参考以下文章

用两个栈实现队列-剑指Offer

《剑指Offer——面试题9:用两个栈实现队列》代码

两个栈实现一个队列

剑指offer-用两个栈实现队列

用两个栈实现一个队列

用两个栈实现一个队列(C++)