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

2023-12-14 08:33:18

文章目录

    • 题目
    • 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"。

文章来源:https://blog.csdn.net/weixin_75202470/article/details/134962127
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。