用栈结构实现队列

基本思路:定义两个栈,一个push1栈,一个pop1栈,每次加入数时,都加入到push1栈中去,每次取数时,都从pop1栈中取。还有一个比较重要的操作就是倒数操作。就是将push1栈中的数倒入到pop1栈中去,利用栈的性质(先进后出),正好可以使push1中的数进入到pop1中后倒过来了(原先在push1中的数:5 4 3 2 1  倒数操作完成后,push1中没有数了,而pop1中的数:1 2 3 4 5)。如果要发生倒数这个操作,必须要满足下面两个条件:

条件1:如果要倒数,必须把push1栈中的数全部倒到pop1中去,不能剩下数。

条件2:如果要倒数,必须确保在倒数之前pop1栈中没有数才行。

只要这两个条件同时满足,就可以发生倒数这个行为。



代码如下:

#include<bits/stdc++.h>
using namespace std;
stack< int >push1,pop1;//放数永远放在push1栈中,出数永远在pop1栈中出
string a;
int n;
void dao()//将push1中的数倒入到pop1中去,利用栈的性质,先进后出,正好可以实现数的倒换。例:原先1 2 3 4 5,倒换后变为:5 4 3 2 1。如果要输出的话,正好可以输出5,符合队列的先进先出的性质
{         //倒数据这个行为必须满足两个条件,第一个是:如果决定要倒数,就必须把push1栈中的数全部倒入到pop1栈中去,必须全部倒入。第二个条件:在倒数之前pop1栈中必须没有数才可以
    if(!pop1.empty())//第二个条件的判断,如果pop1中有数,直接返回
         return ;
    while (!push1.empty())//确保push1中所有的数都倒入到pop1中去
    {
        pop1.push(push1.top());
        push1.pop();
    }
}
void push(int n)
{
    push1.push(n);
    dao();
}
void pop()
{
    if(pop1.empty())//如果pop1栈中没有数了,说明整个队列都没有数了,给用户报错
    {
        cout<<"error"<<endl;
        return ;
    }
    cout<<pop1.top()<<endl;;//输出栈顶的数
    pop1.pop();
}
int main()
{
    while (cin>>a)
    {
        if(a=="push")
        {
            cin>>n;
            push(n);
        }
        if(a=="pop")
        {
            dao();//这个地方确保一种情况,push1中有数,而pop1中没有数,如果出现这种情况,先将push1中的数倒入到pop1中去然后进行pop操作
            pop();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40938077/article/details/80184919