【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()

输入格式:

输入首先给出两个正整数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

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代码:

  • maxmin分别表示S1和S2的最大容量。
  • 使用两个数组S1S2作为堆栈,以及两个指针top1top2分别表示S1和S2的栈顶。
  • 在输入操作中,根据输入的字符执行相应的操作。

具体步骤如下:

  1. 如果输入字符是’A’,表示入队操作。首先读取要入队的元素,然后检查S1的状态:

    • 如果top1小于min,说明S1还有空间,直接将元素压入S1。
    • 如果top1达到了min,但是top2为0(即S2为空),则将S1中的元素转移到S2中,然后再将元素压入S1。
    • 如果top2不为0,说明队列已满,输出"ERROR:Full"。
  2. 如果输入字符是’D’,表示出队操作。首先检查S2的状态:

    • 如果top2不为0,说明S2中有元素,将S2的栈顶元素弹出并输出。
    • 如果top2为0,但是top1不为0,说明S2为空但S1不为空,将S1中的元素转移到S2中,然后再将S2的栈顶元素弹出并输出。
    • 如果top2top1均为0,说明队列为空,输出"ERROR:Empty"。
  3. 如果输入字符是’T’,表示结束操作。

通过这种方式,代码实现了用两个堆栈模拟队列的功能。在每一步操作中,根据堆栈的状态和最大容量来判断是否能够执行相应的入队和出队操作,同时处理可能的错误情况。

并输出。

  • 如果top2top1均为0,说明队列为空,输出"ERROR:Empty"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

without explicit opt-in, is unsupported. Switch Maven repository ‘maven8

Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository maven8 大概意思是 不支持对存储库使用不安全的协议.看下maven库&#xff0c;把http开头的改成https就好了。

B站武sir-django教程(1)

day15 初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。…

Restormer技术点小结

1. 解决cnn的不足&#xff1a; 1&#xff09;感受野有限 2&#xff09;输入尺寸固定 2. 解决transform的不足&#xff1a; 1&#xff09;计算复杂度随着空间分辨率的增加而二次增长 3. 优势结构&#xff1a;MDTA(Multi-Dconv Head Transposed Attention)和GDFN( Gated-Dco…

医疗机构,为什么要开通预约挂号服务?门诊患者双向“获利”

随着科技的不断发展&#xff0c;越来越多的医疗机构开始提供预约挂号服务&#xff0c;以更方便、快捷地为患者提供就诊服务。 减少患者在等待时间上的压力&#xff0c;让患者更加有序地安排自己的就医计划。同时&#xff0c;预约挂号还可以提高医疗门诊工作效率与患者的满意度…

Sentinel使用详解

组件简介 Sentinel是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景&#xff0c;例如秒杀、消息削峰填谷、集群流量控…

C语言 内存操作函数 +内存分区

内存操作函数 memset() //memset 函数将指定内存区域 ptr 开始的 num 个字节设置为 value。 void *memset(void *ptr, int value, size_t num);参数&#xff1a;ptr&#xff1a;指向要填充的内存区域的指针。value&#xff1a;要填充的值&#xff0c;以整数形式传递。num&…

20-11版本AUTOSAR_PRS_LogAndTraceProtocol文档翻译

1简介和概述 本协议规范规定了AUTOSAR协议Dlt的格式、消息序列和语义。 该协议允许将诊断、日志和跟踪信息发送到通信总线上。 因此&#xff0c;Dlt模块从应用程序或其他软件模块收集调试信息&#xff0c;向调试信息添加元数据&#xff0c;并将其发送到通信总线。 此外&#x…

软件设计师——信息安全(一)

&#x1f4d1;前言 本文主要是【信息安全】——软件设计师——信息安全的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

QStringListModel 是 Qt 框架中用于在模型-视图(Model-View)架构中展示字符串列表的类

QStringListModel 是 Qt 框架中用于在模型-视图&#xff08;Model-View&#xff09;架构中展示字符串列表的类。 QStringListModel 继承自 QAbstractListModel&#xff0c;是一个基于字符串列表的数据模型。它提供了一种方便的方式来将字符串列表作为数据源&#xff0c;供各种…

华为OD试题五(数列描述、矩阵最大值、数据分类)

1. 数列描述 示例代码&#xff1a; # 核心 从第一项 推 第N项目 # 第一项 a0 1 # 推到 第N项 N 4 def fun(a0):# 计算每一项的具体值result left 0cursor 0while cursor < len(a0):if a0[cursor] ! a0[left]:count cursor -leftresult "{}{}".format(str(…

面相对象开发的原则

1、开闭原则 对修改关闭&#xff0c;对扩展打开。 2、里氏替换原则 子类继承父类的方法时&#xff0c;不可重写父类的方法。 如果重写了父类的方法会导致整个继承体系比较差&#xff0c;特别是运用多态比较平凡时&#xff0c;程序运行出错概率较大。 如果出现了违背“里氏替换…

计网Lesson9 - 链路协议和网络概述

文章目录 数据链路层协议Ethernet V2标准Ethernet V2帧格式Ethernet V2帧长度标准以太网帧 MAC 帧协议 PPP 协议PPP 概述PPP 帧 网络层网络层的设计选择 数据链路层协议 Ethernet V2标准 Ethernet V2帧格式 以太网帧格式说明&#xff1a; 6 6 6 字节目标地址 6 6 6 字节源地…

【LeetCode每日一题】1904. 你完成的完整对局数

给你两个字符串 startTime 和 finishTime &#xff0c;均符合 "HH:MM" 格式&#xff0c;分别表示你 进入 和 退出 游戏的确切时间&#xff0c;请计算在整个游戏会话期间&#xff0c;你完成的 完整对局的对局数 。 如果 finishTime 早于 startTime &#xff0c;这表示…

verilog基础,连续赋值之组合逻辑

连续赋值语句可以完成任意组合逻辑&#xff0c;本节对基本的逻辑电路进行测试分析&#xff0c;主要包含一下内容&#xff1a; 1. 反相器 2. 与门 3.与非门 4.或门 5.或非门 6.异或门 7.同或门 verilog实现逻辑操作的算符如下 // ~ .... Invert a single-bit signal…

C语言:判断大端小端

代码实现&#xff1a; 第一种&#xff1a; ​ int main() {int a 1;char* p (char*) & a;//char* -- 访问一个字节&#xff08;第一个地址&#xff09;if (*p 1){printf("小端\n");}else{printf("大端\n");}return 0; }​ 代码解析&#xff1a; …

「Leetcode」滑动窗口—长度最小的子数组

&#x1f4bb;文章目录 &#x1f4c4;题目✏️题目解析 & 思路&#x1f4d3;总结 &#x1f4c4;题目 209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …,…

【UE 材质】角色触碰空气墙效果

效果 步骤 1. 新建一个工程&#xff0c;创建一个Basic关卡&#xff0c;添加一个第三人称游戏资源到内容浏览器 2. 新建一个材质参数集&#xff0c;这里命名为“MPC_Vector” 打开“MPC_Vector”&#xff0c;添加一个向量参数 3. 新建一个材质&#xff0c;这里命名为“M_Wall”…

力扣每日一题:2132. 用邮票贴满网格图(2023-12-14)

力扣每日一题 题目&#xff1a;2132. 用邮票贴满网格图 日期&#xff1a;2023-12-14 用时&#xff1a;38 m 32 s 思路&#xff1a;使用前缀和&#xff0b;差分&#xff0c;只是往常是一维&#xff0c;现在变二维了&#xff0c;原理差不多 时间&#xff1a;22ms 内存&#xff1…

运行和部署若依分离版前端

一、运行 一、用vscode打开 二、安装依赖 # 建议不要直接使用 cnpm 安装依赖&#xff0c;会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registryhttps://registry.npmmirror.com# 启动服务 npm run dev浏览器访问 http://localhost:80二、部…

数据库的优化

1、创建index索引&#xff1b; 2、减少select * 的使用&#xff0c;具体一点&#xff0c;全取会增加web服务器的负担&#xff1b; 3、explain select&#xff1a;显示了mysql如何使用索引来处理select语句以及连接表&#xff1b; 4、度多使用varchar/nvarchar&#xff0c;变长…