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

设已知有两个堆栈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

这道题我一开始用的stl,后来遇到重题了,就用数组模拟了一遍,发现用stl真的是很简单。下面分别附上stl和非stl的方法。

//stl实现
#include <bits/stdc++.h>
using namespace std;
int main()
{stack<int>s1,s2;int m,n,t;cin>>m>>n;if (n>m){t=m;m=n;n=t;}      //s2 smallerchar c;int num;getchar();while (1){scanf("%c",&c);        //A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D Tif (c=='T'){break;}if (s2.size()==n&&s1.empty()){while(!s2.empty()){s1.push(s2.top());s2.pop();}}if (c=='A'&&s2.size()!=n){scanf("%d ",&num);s2.push(num);}else if (c=='A'&&s2.size()==n){scanf("%d",&num);printf("ERROR:Full\n");}if (c=='D'&&s1.empty()){printf("ERROR:Empty\n");}else if (c=='D'&&!s1.empty()){printf("%d\n",s1.top());s1.pop();}}return 0;
}

//数组构建栈模拟
#include <bits/stdc++.h>
using namespace std;
int main()
{int n1,n2,top1=-1,top2=-1,t;cin>>n1>>n2;        //n2是比较小的if (n2>n1){t=n1;n1=n2;n2=t;}getchar();int s1[100],s2[100];         //3 2char c;                           //A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D Tint x;scanf("%c",&c);while (c!='T'){if (c=='A'){if(top2<n2-1)      //如果短的2没满,一直填充到2.{scanf("%d",&x);s2[++top2]=x;getchar();}else if (top2==n2-1&&top1!=-1)      //如果2满了但是1不为空,此时无法进行数据移动,输出FULL. {scanf("%d",&x);getchar();printf("ERROR:Full\n");}else if (top2==n2-1&&top1==-1)    //如果2满了但是1是空的,数据移动,全部移过去. {while (top2!=-1){s1[++top1]=s2[top2--];}scanf("%d",&x);s2[++top2]=x;getchar();}}if (c=='D'){getchar();if (top1!=-1)                    //如果1不是空的,先输出1,因为他的数输入的更早. {printf("%d\n",s1[top1--]);}else if (top2!=-1&&top1==-1)          //如果2不是空的但是1是空的,转换数据,再输出. {while (top2!=-1){s1[++top1]=s2[top2--];}printf("%d\n",s1[top1--]);}else if (top1==-1&&top2==-1)         //都是空的,输出错误提示. {printf("ERROR:Empty\n");}}scanf("%c",&c);}return 0;
}

7-4 堆栈模拟队列 (25 分)相关推荐

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

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

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

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

  3. PTA: 7-2 银行业务队列简单模拟 (25 分)

    大一下半期数据结构 数据结构题目集 7-2 银行业务队列简单模拟 (25 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客 ...

  4. 5-2 Windows消息队列 (25分)

    5-2 Windows消息队列   (25分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中 ...

  5. 数据结构与算法--4.使用堆栈模拟队列

    问题: 队列的插入和删除遵循先入先出的原则,而堆栈遵循后进先出的原则. 用两个堆栈模拟队列,要求实现时不能分配超过O(1)的内存,时间复杂度必须是o(m). 思路: 用两个堆栈模拟队列,必须要支持两种 ...

  6. 7-1 银行业务队列简单模拟 (25 分)

    题目: 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银行的顾客序列,请按业务完成的顺序输出 ...

  7. 7-8 Windows消息队列 (25 分)

    消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中.同时,如果队列不是空的,这一进程循环地从队列中 ...

  8. 7-26 Windows消息队列 (25 分)(详解+思路+超时解决)

    一:题目 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中.同时,如果队列不是空的,这一进程循环 ...

  9. 3-08. 栈模拟队列(25)(ZJU_PAT 模拟)

    主题链接:http://pat.zju.edu.cn/contests/ds/3-08 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操 ...

最新文章

  1. CentOS 6.0安装ipvsadm 1.26错误笔录
  2. Golang cgo编程 [] string 转 C语言 char**
  3. META http-equiv=X-UA-Compatible content=IE=EmulateIE7
  4. 计算机公开课教学反思,语文公开课教学反思
  5. LCA问题的RMQ解法解析
  6. (09)Vivado IO约束
  7. oracle 自定义表类型赋值,Oracle自定义类型 Record + PL/SQL表
  8. ai怎么画路线_使用AI画一个离心管
  9. python解析dom,关于Python解析xml dom的简单应用
  10. python修饰符号的使用_Python 函数修饰符(装饰器)的使用
  11. YDOOK:ANSYS 谐波分析的要点和主要应用场景 谐波效应的来源
  12. 分布式事务专题-基础概念(1)
  13. 子集构造法NFA转换成DFA
  14. 旋转变换公式详细推导
  15. 「镁客·请讲」Video++董慧智:让AI融入消费级视频,我们打开了视频的“黑盒子”...
  16. Functional Programming For The Rest of Us 翻译,重译 (剩人们的函数式编程)
  17. python爬虫入门_3种方法爬取古诗文网站
  18. Axure RP8原型设计(一)
  19. Java项目:红酒朔源管理系统(java+SSM+JSP+LayUI+jQuery+Mysql)
  20. Matlab中的movie问题、动态演示问题

热门文章

  1. LeetCode 1480. 一维数组的动态和(前缀和)
  2. LeetCode 784. 字母大小写全排列(位运算回溯)
  3. LeetCode 709. 转换成小写字母
  4. Flask简介与简单项目操作流程
  5. django简介及环境搭建
  6. transition动画与transform变换(了解
  7. dz论坛php.ini设置,Discuz!X1.5至3.2论坛Win主机与Linux主机伪静态设置方法
  8. Power Bi:DAX函数总结
  9. 可以闭眼入的O'REILLY机器学习神书出新版了!
  10. SQL解析在美团的应用