输入格式:
输入首先给出两个正整数N1
和N2
,表示堆栈S1
和S2
的最大容量。随后给出一系列的队列操作: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;
}