【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"。
目录
相关文章
|
6月前
|
算法 前端开发 vr&ar
☆打卡算法☆LeetCode 225. 用队列实现栈 算法解析
☆打卡算法☆LeetCode 225. 用队列实现栈 算法解析
L2-033 简单计算器 (25 分)(栈模拟)
L2-033 简单计算器 (25 分)(栈模拟)
362 0
L2-033 简单计算器 (25 分)(栈模拟)
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
31 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
算法 编译器 C++
[C++随想录] 优先级队列的模拟实现
[C++随想录] 优先级队列的模拟实现
|
6月前
【刷题-PTA】堆栈模拟队列(代码+动态图解)
【刷题-PTA】堆栈模拟队列(代码+动态图解)
133 0
|
存储 算法 C++
代码随想录算法训练营第10天|232.用栈实现队列,225. 用队列实现栈
代码随想录算法训练营第10天|232.用栈实现队列,225. 用队列实现栈
竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解
竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解
竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解
|
调度
leetcode.1114-按序打印-多线程案例
leetcode.1114-按序打印-多线程案例
108 0
|
程序员
【LeetCode232】用栈模拟实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false