题目
设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。
所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:
int IsFull(Stack S)
:判断堆栈S
是否已满,返回1或0;int IsEmpty (Stack S )
:判断堆栈S
是否为空,返回1或0;void Push(Stack S, ElementType item )
:将元素item
压入堆栈S
;ElementType Pop(Stack S )
:删除并返回S
的栈顶元素。实现队列的操作,即入队
void AddQ(ElementType item)
和出队ElementType DeleteQ()
。输入格式:
输入首先给出两个正整数
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
C代码
#include<stdio.h> int main() { int N1,N2,max,min; scanf("%d%d",&N1,&N2); if(N1>N2) { max=N1; min=N2; } else { max=N2; min=N1; } int s1[min],s2[max],top1=0,top2=0,item; char ch; scanf("%c",&ch); while(ch!='T') { if(ch=='A') { scanf("%d",&item); if(top1<min) { s1[top1++]=item; } else if(top2==0) { while(top1!=0) { s2[top2++]=s1[--top1]; } s1[top1++]=item; } else { printf("ERROR:Full\n"); } } else if(ch=='D') { if(top2!=0) { printf("%d\n",s2[--top2]); } else if(top2==0&&top1!=0) { while(top1!=0) { s2[top2++]=s1[--top1]; } printf("%d\n",s2[--top2]); } else { printf("ERROR:Empty\n"); } } scanf("%c",&ch); } return 0; }
详解
当我们使用两个栈S1和S2模拟队列时,我们需要考虑如何处理入队和出队操作。
入队操作 (A item
)
- 如果S1的大小小于它的最大容量,我们将元素压入S1。
- 如果S1已满,但是S2为空,我们将S1中的所有元素移动到S2中,然后再将元素压入S1。
- 如果S1已满,而且S2也不为空,表示队列已满,输出"ERROR:Full"。
出队操作 (D
)
- 如果S2中有元素,我们将S2的栈顶元素弹出并输出。
- 如果S2为空,但是S1不为空,我们将S1中的所有元素移动到S2中,然后再将S2的栈顶元素弹出并输出。
- 如果S2和S1均为空,表示队列为空,输出"ERROR:Empty"。
结束操作 (T
)
- 结束输入。
让我们根据这个逻辑来解释给出的C代码:
max
和min
分别表示S1和S2的最大容量。- 使用两个数组
S1
和S2
作为堆栈,以及两个指针top1
和top2
分别表示S1和S2的栈顶。 - 在输入操作中,根据输入的字符执行相应的操作。
具体步骤如下:
- 如果输入字符是’A’,表示入队操作。首先读取要入队的元素,然后检查S1的状态:
- 如果
top1
小于min
,说明S1还有空间,直接将元素压入S1。 - 如果
top1
达到了min
,但是top2
为0(即S2为空),则将S1中的元素转移到S2中,然后再将元素压入S1。 - 如果
top2
不为0,说明队列已满,输出"ERROR:Full"。
- 如果输入字符是’D’,表示出队操作。首先检查S2的状态:
- 如果
top2
不为0,说明S2中有元素,将S2的栈顶元素弹出并输出。 - 如果
top2
为0,但是top1
不为0,说明S2为空但S1不为空,将S1中的元素转移到S2中,然后再将S2的栈顶元素弹出并输出。 - 如果
top2
和top1
均为0,说明队列为空,输出"ERROR:Empty"。
- 如果输入字符是’T’,表示结束操作。
通过这种方式,代码实现了用两个堆栈模拟队列的功能。在每一步操作中,根据堆栈的状态和最大容量来判断是否能够执行相应的入队和出队操作,同时处理可能的错误情况。
并输出。
- 如果
top2
和top1
均为0,说明队列为空,输出"ERROR:Empty"。