【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"。
目录
相关文章
|
4月前
|
算法 前端开发 vr&ar
☆打卡算法☆LeetCode 225. 用队列实现栈 算法解析
☆打卡算法☆LeetCode 225. 用队列实现栈 算法解析
|
6月前
|
存储
【栈与队列面试题】用队列实现栈(动图演示)
【栈与队列面试题】用队列实现栈(动图演示)
L2-033 简单计算器 (25 分)(栈模拟)
L2-033 简单计算器 (25 分)(栈模拟)
300 0
L2-033 简单计算器 (25 分)(栈模拟)
|
4月前
【刷题-PTA】堆栈模拟队列(代码+动态图解)
【刷题-PTA】堆栈模拟队列(代码+动态图解)
60 0
|
9月前
ACM刷题之路(十一)堆、栈、队列实现表达式转换
ACM刷题之路(十一)堆、栈、队列实现表达式转换
|
9月前
|
存储
竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解
竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解
竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解
|
10月前
|
调度
leetcode.1114-按序打印-多线程案例
leetcode.1114-按序打印-多线程案例
75 0
|
11月前
|
设计模式 存储 算法
【c++】:“无敌的适配器来咯“栈和队列模拟实现以及优先级队列的模拟实现。
【c++】:“无敌的适配器来咯“栈和队列模拟实现以及优先级队列的模拟实现。
39 0
|
存储 算法 Java
java数据结构,一个案例带你用数组模拟队列,环形队列!
java数据结构,一个案例带你用数组模拟队列,环形队列!
116 0
java数据结构,一个案例带你用数组模拟队列,环形队列!
|
算法
leetcode-每日一题636. 函数的独占时间(模拟栈)
如果是start,我们需要判断上一个函数是否已经end执行完成,若没有则让上一个函数进入睡眠状态,等到后面end的时候进行唤醒,也就是把上一个函数的开始时间修改成当前函数的开始时间,再把当前函数的编号和开始时间添加到堆栈顶部,如果已经完成了,则把当前的函数编号和开始时间放入堆栈顶部
75 0
leetcode-每日一题636. 函数的独占时间(模拟栈)