【PTA刷题】堆栈模拟队列代码+详解

简介: 【PTA刷题】堆栈模拟队列代码+详解


题目

设已知有两个堆栈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"。
  1. 如果输入字符是’D’,表示出队操作。首先检查S2的状态:
  • 如果top2不为0,说明S2中有元素,将S2的栈顶元素弹出并输出。
  • 如果top2为0,但是top1不为0,说明S2为空但S1不为空,将S1中的元素转移到S2中,然后再将S2的栈顶元素弹出并输出。
  • 如果top2top1均为0,说明队列为空,输出"ERROR:Empty"。
  1. 如果输入字符是’T’,表示结束操作。

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

并输出。

  • 如果top2top1均为0,说明队列为空,输出"ERROR:Empty"。
目录
相关文章
|
10月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧文旅旅游线路规划与游客流量均衡调控中的应用实践(196)
本实践案例深入探讨了Java大数据技术在智慧文旅中的创新应用,聚焦旅游线路规划与游客流量调控难题。通过整合多源数据、构建用户画像、开发个性化推荐算法及流量预测模型,实现了旅游线路的精准推荐与流量的科学调控。在某旅游城市的落地实践中,游客满意度显著提升,景区流量分布更加均衡,充分展现了Java大数据技术在推动文旅产业智能化升级中的核心价值与广阔前景。
|
存储 人工智能 Serverless
方案测评 | 零基础一键AI剧本生成与动画创作
阿里云推出基于AI技术的剧本生成与动画创作解决方案,利用函数计算FC、百炼模型服务和ComfyUI工具,实现从剧本撰写到视频合成的一站式自动化流程。该方案大幅降低动画制作的技术门槛与成本,加速内容生产,帮助创作者快速响应市场变化。通过体验发现,方案在高效性、创新性方面表现突出,但也存在视频生成时间较长、定制化功能不足等问题。整体而言,该方案为动画创作提供了新的可能性,尤其适合初创团队和个人创作者。
|
开发框架 .NET C#
如何判断一个 Dot Net 程序是 32 位还是 64 位?
如何判断一个 Dot Net 程序是 32 位还是 64 位?
|
关系型数据库 API C#
C#调用执行命令行窗口cmd,及需要交互执行的处理
C#执行外部程序用到的是Process进程类,打开一个进程,可以指定进程的启动信息StartInfo(启动的程序名、输入输出是否重定向、是否显示UI界面、一些必要参数等)...
4551 0
C#调用执行命令行窗口cmd,及需要交互执行的处理
|
开发框架 NoSQL 前端开发
在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息
在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息
|
SQL 关系型数据库 数据库连接
详解 Entity Framework(EF)核心组件与数据访问方法探索
Entity Framework是一个ORM框架,简化.NET开发者与数据库的交互。它始于.NET Framework的一部分,但现在可通过NuGet独立获取。ORM允许对象模型直接映射到数据库结构,避免直接编写SQL。
2574 2
详解 Entity Framework(EF)核心组件与数据访问方法探索
|
存储 JSON 关系型数据库
带你走进PostgreSQL的世界
带你走进PostgreSQL的世界
1096 0
|
存储 JavaScript Windows
Electron——如何检测应用程序的未响应状态
Electron——如何检测应用程序的未响应状态
409 0
|
SQL 存储 分布式计算
关于数据仓库的Hive的安装部署的远程模式
在数据分析和数据挖掘领域,数据仓库是一个非常重要的工具。Hive是阿里云提供的一个开源数据仓库解决方案,它基于Hadoop和HiveQL语言,可以帮助用户轻松地处理大规模数据。在本文中,我们将探讨Hive的安装部署以及远程模式的概念和优势。
548 1
|
C# 开发者
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版
主要类 1.NamedPipeClientStream 2.NamedPipeServerStream 解释:命名管道是一种进程间通信的方式,它允许不同进程之间在同一台机器上进行通信
2112 2
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版

热门文章

最新文章