当前位置:首页 >> 编程语言 >> 【PTA刷题】堆栈模拟队列代码+详解,佳能eos 550d

【PTA刷题】堆栈模拟队列代码+详解,佳能eos 550d

cpugpu芯片开发光刻机 编程语言 2
文件名:【PTA刷题】堆栈模拟队列代码+详解,佳能eos 550d 【PTA刷题】堆栈模拟队列代码+详解

文章目录 题目C代码详解

题目

设已知有两个堆栈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 2A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T

输出样例:

ERROR:Full1ERROR:Full23478ERROR: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"。
协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接