7-22 堆栈模拟队列 (25分)

该博客讨论如何使用两个堆栈S1和S2来模拟一个队列Q,通过IsFull、IsEmpty、Push和Pop等操作实现队列的AddQ(入队)和DeleteQ(出队)功能。当堆栈满或空时,需要特殊处理以保持队列的正确顺序。文章提供了一个具体的输入输出样例,并解释了处理入队和出队操作的逻辑和注意事项。
摘要由CSDN通过智能技术生成

题目:设已知有两个堆栈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()。
输入格式:
输入首先给出两个正整数N1和N2,表示堆栈S1和S2的最大容量。随后给出一系列的队列操作: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

思路
1、首先要比较两个堆栈的大小。容量小的堆栈(设为1)为队列输入使用,容量大的堆栈(设为2)为队列输出使用。
2、入队列:若堆栈1未满,把元素压入到堆栈1中;
若堆栈1满,且堆栈2为空,则把堆栈1中的所有元素pop到堆栈2中(所以说要堆栈2 的容量大于等于堆栈1的容量,否则全部元素不能都Pop出去),再将待入列的元素压入到堆栈1中;
若堆栈1满,且堆栈2不为空,则队列满,不能再有元素入列,输出ERROR:Full(因为1已经满了,此时不能再将元素压入1中;同时也不能再将1中的元素Pop出去再压入2中,因为2中已经有元素了,若再压入,其进队列的先后顺序就乱了)
3、出队列:若堆栈2不为空,则Pop堆栈2;
若堆栈2为空,堆栈1不为空,则把1中元素压入2中,再Pop堆栈2
若1和2都为空,则队列为空,输出ERROR:Empty
注意
此题中输入的数据不一定是一位整数,可能是多位整数

#include<iostream>
using namespace std;

int 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值