堆栈模拟队列 PTA (25)

输入格式:

输入首先给出两个正整数N1N2,表示堆栈S1S2的最大容量。随后给出一系列的队列操作:A item表示将item入列(这里假设item为整型数字);D表示出队操作;T表示输入结束。

输出格式:

对输入中的每个D操作,输出相应出队的数字,或者错误信息ERROR:Empty。如果入队操作无法执行,也需要输出ERROR:Full。每个输出占1行。

输入样例:

3 2
A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T

输出样例:

ERROR:Full
1
ERROR:Full
2
3
4
7
8
ERROR:Empty

这题我起先看到以为是简单的将两个数相加变成一个大的数组,然后就是简单的队列操作然后试出了很多答案就是不对,后来才知道本题的正确思路

思路:

一、关于输入栈

1.输入栈比较小

2.只有输出栈为空的时候才可以将输入栈压栈-----这就是为什么示例输出前三个有两个ERROR:Full的原因

二、关于输出栈

跟我们平常使用队列的出队没什么的区别了,它本身为空栈的时候它不管输入栈有没有满栈就可以向它索要元素用来输出 直到输入栈也为空;

三、区别

压栈数量的时候取决与输入栈的大小,如果没有出栈的话,它最多可以压入2*m个,而正常队列可以m+n。m<n

四、关于如何将输入栈元素运到输出栈

可以类比为到水,到第一桶水时,也就是输入到输入栈;前面的水在下面,此时栈顶在下面;后面的水在上边,栈底在上面;再倒到另外的一个水桶中,也就是输出栈;原来下面的水又回到了上面,栈顶在数组的后边;上面的水又回到了下面,栈底为数组的开头元素。

#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d %d\n",&m,&n);
    if(m>n)m^=n^=m^=n;//交换两者的值变成m<n
    int a[m],b[n];//a为输入栈,b为输出栈
    char ch;//命令
    int top1=-1,top2=-1;
    while((ch=getchar())!='T'){
        if(ch=='A'){
            int temp;scanf("%d",&temp);
            if(top1==m-1 && top2!=-1) printf("ERROR:Full\n");//其实就是输入栈满,输出栈不为空,压不过去,栈满
            else if(top1==m-1 && top2==-1){//输入栈满输出栈为空,压得过去了,新元素入输入栈
                while(top1>=0)b[++top2]=a[top1--];//现在栈顶在上面
                a[++top1] =temp;
            }
            else if(top1<m-1) a[++top1] = temp;//输入栈未满则temp直接入栈
        }
        else if(ch=='D'){
            if(top2!=-1) printf("%d\n",b[top2--]);//输出栈若不为空则输出栈顶
            else if(top2==-1 && top1!=-1){//输出栈为空输入栈不为空则把输入栈元素移动到输出栈
                while(top1>=0) b[++top2] = a[top1--];
                printf("%d\n",b[top2--]);
            }
            else printf("ERROR:Empty\n");//否则说明栈空
        }
    }
    return 0;
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值