堆栈模拟队列 (20分)

思想如下:

        栈先进后出,队列先进先出,所以需要两个栈模拟一个队列,
一个栈用于接收数据,另一个栈用于将数据的顺序逆置,使得先入栈的元素到达栈顶,实现“先出”,当仍有输入,而用于逆置数据的栈中留存数据,则无法将输入栈的数据放到逆置栈的栈底,出现满栈;由于输入序列需要存入逆置序列,并且只有输入序列满栈才应该把数据传入逆置栈,以实现最大队列容量,因而逆置序列要大于输入序列;此外,在需要进行出栈操作时,如果逆置栈空需要判断输入栈是否能压栈入逆置栈。

镇贴之宝:

           【】
【】    【】
【】    【】

代码如下:

#include <iostream>
#include <stack>
using namespace std;

char getOperate();
int main()
{
    int n1,n2,tranMax,inputMax,tranNow=0,inputNow=0;
    cin>>n1>>n2;
    if(n1>n2)
    {tranMax=n1;inputMax=n2;}
    else{tranMax=n2;inputMax=n1;}
    stack<int> iStack,tStack;

    int done=0,in;
    while(!done)
    {
        //先判断是否逆置
        if(inputNow==inputMax && tStack.empty())
        {
            while(!iStack.empty())
            {
                in=iStack.top();
                iStack.pop();
                tStack.push(in);
            }
            inputNow=0;
        }

        switch(getOperate())
        {
        case 'A':
                cin>>in;
                if(inputNow<inputMax)//PushInput
                {
                    iStack.push(in);
                    inputNow++;
                }
                else
                {
                    cout<<"ERROR:Full"<<endl;
                }
                break;
        case 'D':
                if( !tStack.empty() )
                {
                    in=tStack.top();
                    tStack.pop();
                    cout<<in<<endl;
                }
                else if(tStack.empty() && !iStack.empty())
                {
                    while(!iStack.empty())
                    {
                        in=iStack.top();
                        iStack.pop();
                        tStack.push(in);
                    }
                        inputNow=0;

                    in=tStack.top();
                    tStack.pop();
                    cout<<in<<endl;
                }
                else
                    cout<<"ERROR:Empty"<<endl;
                break;
        case 'T':

                done=1;
                break;

            }//switch

        }

    return 0;
}

char getOperate()
{
    char t;
    cin>>t;
    return t;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值