主题链接:http://pat.zju.edu.cn/contests/ds/3-08

设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。

所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:

(1) int IsFull(Stack S):推断堆栈S是否已满,返回1或0;
(2) int IsEmpty (Stack S ):推断堆栈S是否为空,返回1或0。
(3) void Push(Stack S, ElementType item ):将元素item压入堆栈S;
(4) 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行。

例子输入与输出:

序号 输入 输出
1
2 2
A 1 A 2 D D T
1
2
2
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

PS:

个人认为题意有点难理解!反正我是理解了好久!

代码例如以下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
stack<int>s1;//容量小的栈
stack<int>s2;//容量大的栈
int main()
{int n1, n2;char c;while(~scanf("%d%d",&n1,&n2)){if(n1 > n2){int t = n1;n1 = n2;n2 = n1;}getchar();int tt;int flag = 0;for(int i = 0; ; i++){scanf("%c",&c);if(c == 'T')//结束输入break;if(c == 'A'){scanf("%d",&tt);if(s1.size()==n1 && s2.size()!=0)//假设栈s1满且栈s2不为空,则队满{printf("ERROR:Full\n");continue;}if(s1.size()!=n1)//假设栈s1没有满,直接压入s1.push(tt);else{int len = s1.size();//假设栈s1满。把栈s1的全部元素弹出压入s2for(int i = 0; i < len; i++){int t = s1.top();s1.pop();s2.push(t);}s1.push(tt);//压入s1}}else if(c == 'D'){if(s1.size()==0 && s2.size()==0){printf("ERROR:Empty\n");continue;}if(s2.size() == 0)//若栈s2空就将s1中的全部元素弹出到栈s2中,然后出栈{int len = s1.size();for(int i = 0; i < len; i++){int t = s1.top();s1.pop();s2.push(t);}}printf("%d\n",s2.top());s2.pop();}}}return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/bhlsheji/p/4887299.html

3-08. 栈模拟队列(25)(ZJU_PAT 模拟)相关推荐

  1. 7-4 堆栈模拟队列 (25 分)

    7-4 堆栈模拟队列 (25 分) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判 ...

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

    设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或0: in ...

  3. 7-22 堆栈模拟队列 (25 分)(详解夹思路)

    一:题目 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或 ...

  4. 队列与环形队列使用数组模拟

    队列 该文是观看尚硅谷韩老师视频学习自己总结学习得,有的是来源于网络收集 队列引入 进的一端称为队尾(rear),出的一端称为队头(front).队列可以用顺序存储,也可以用链式存储. 队列介绍 队列 ...

  5. JAVA数据结构与算法【队列、数组模拟(环形)队列】

    队列 使用场景:排队 队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 ...

  6. 数据结构——栈与队列操作(用栈模拟队列)

    [栈与队列操作] 问题描述:假设有两个长度相同的栈 S1,S2,已知以下入栈.出栈.判栈满和判栈空操作: void Push(S,x); Elemtype Pop(S); bool StackFull ...

  7. 数组模拟栈和队列板子

    使用数组模拟数据结构栈和队列 栈:后进先出 对于栈:我们使用tt表示栈顶的下标,如果tt==0表示栈空 队列:先进先出 对于队列,我们使用hh表示队首,tt表示队尾,tt初始化为-1,判断队列是否为空 ...

  8. 【干货】容器适配器实现两个栈模拟队列

    用两个栈模拟队列的思想就是"倒水思想",这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下: #include<iostream ...

  9. LinkedList 模拟栈和队列

    LinkedList 比ArrayList 提供了更多的方法,其中有两个方法可以实现栈和队列的操作. removeFirst() 移除并返回此列表中的第一个元素. removeLast() 移除并返回 ...

最新文章

  1. 这位中国小伙 6个月用比特币攒了125个亿 !
  2. 打造数字化服务能力,中国联通如何借助云原生技术实现增长突围?
  3. boost::spirit模块利用 std::tuple 将多个属性包装成一个的测试程序
  4. 多模块Maven工程单独打包某一模块工程
  5. ssl1010-方格取数
  6. jquer WdatePicker 使用 手册
  7. Mac 的 Adobe Creative Cloud 无法连接至服务器的解决办法?
  8. python建模_python建模实例详解
  9. 阿酷三合一版_阿酷插件3.2开源版
  10. mdx词典包_译者的电子工具——手机词典上篇
  11. Arduino—— SSD1306 OLED IIC
  12. 背景图页面缩小会变形_HTML中怎么让背景图片跟着浏览器窗口变大变小?
  13. 【备战春招/秋招系列】美团Java面经总结终结篇 (附详解答案)
  14. 计算机怎么换桌面皮肤,如何更换电脑腾讯视频上的皮肤样式
  15. 关于NorFlash的一点总结
  16. 微软亚洲研究院面试题
  17. 计算机基础_001_栈是什么
  18. SpringBoot使用Netty实现远程调用
  19. 专科mysql数据库大作业_数据库大作业整理·总
  20. macos 上的各种下载软件安装方式

热门文章

  1. VMware vSphere Client 5.0在官网用讯雷下载出错
  2. thinkphp3.1的新功能
  3. MM的静态寻址和动态寻址
  4. SAP BAPI的一些初级资料
  5. DateChooser ASP.NET 2.0版 之实用版
  6. centos6 yum源不能使用
  7. chrome上很棒的爬虫插件,至少爬取博客够用了
  8. 如果要和外国人做项目,加入一个teams是第一步,就跟我们的企业微信,钉钉差不多
  9. IEnumeratorTItem和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了...
  10. 在linux中安装mysql时遇到的问题