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

题目思路:
1.不用真的去实现题目中说的那么多函数的功能,可以采用两个整形数组模拟一下即可。
2.想要达到队列先进先出的效果,那么一定是让数据在入栈以后,在另一个栈中“翻个身”,也就是说让小的栈作为输入栈,大的栈作为输出栈(因为小的栈够短,能够在大的栈中“翻身”)。
3.队空条件,两个栈(数组)都为空。
4.栈满条件,输入栈满了并且输出栈里还有元素。(自己在纸上画画,在这种条件下,如果进行“翻身”动作,那么原本在输出栈准备输出的元素就被压到下面了,不符合队列的规则)

#include<iostream>
using namespace std;
void swap(int& a, int& b){  int t = a; a = b; b = t;}int main()
{int m, n, x;int st1[100], st2[100], k1 = 0, k2 = 0;cin >> m >> n;if(m < n) swap(m, n);    //把小栈大小定位n,方便统一处理char c;while (cin >> c && c != 'T'){if (c == 'A'){cin >> x;if (k2 == n && k1)  //栈满cout << "ERROR:Full\n";else if (k2 < n)st2[k2++] = x;else if (k2 == n && !k1){while (k2)//翻身{st1[k1++] = st2[--k2];}st2[k2++] = x;    //翻身以后再输入}elsecout << "ERROR:Full\n";}else if (c == 'D'){if (!k1 && !k2)//栈空cout << "ERROR:Empty\n";else if (k1)cout << st1[--k1] << endl;else if (!k1 && k2)   {while (k2)     //翻身{st1[k1++] = st2[--k2];}cout << st1[--k1] << endl;//翻身以后再输出}}}return 0;
}

3-8 堆栈模拟队列 (25 分)相关推荐

  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. PTA: 7-2 银行业务队列简单模拟 (25 分)

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 程序员在翻车时的30种常见反应
  2. 把jquery的this写入选择器里(伪写入)哈哈~
  3. 干掉状态:从session到token
  4. 数学知识在游戏中的运用
  5. SqlServer2008备份与还原(完整图示版)
  6. 面向对象9:方法的重写、super关键字、子类对象的实例化过程
  7. AD 09 PCB生成GERBER生产文件全过程
  8. magisk卸载内置软件_GJ2x_免root搞机工具箱V6.71 更新:增加卸载内置功能
  9. 网页保存视频最有效的几种方法
  10. 产出投入表结构类型的介绍
  11. 孙悟空的师傅的真实身份
  12. 头条视频不足一分钟有收益吗,头条30秒视频都有收益吗
  13. 操作系统(Linux)
  14. unity中Game视图中实现和Scene视图中一样的摄像机操作
  15. linux下 不显示光驱,Windows7电脑下不显示光驱盘符的解决方法
  16. 东田纳西州立大学计算机排名,美国东田纳西州立大学介绍
  17. 苹果手机充值显示服务器异常,球球大作战iOS会员充值异常解决办法
  18. word怎么设置边距为80磅_Word排版不能忽视的「标尺」工具,6 种用法 80% 的人不知道!...
  19. pgsql:字符串转数值
  20. Chrome驱动程序无法打开Chrome浏览器

热门文章

  1. 第三季-第20课-多线程程序设计
  2. Oculus:自己做内容不是长远之计,资助第三方开发者才是王道
  3. 【小贴士】工作中的”闭包“与事件委托的”阻止冒泡“
  4. 01我为什么学Unity3d
  5. python selenium --鼠标事件
  6. 18个有用的 .htaccess 文件使用技巧
  7. 【转】windows下mongodb安装与使用整理
  8. 无法注册这篇文档........
  9. DS4300电池即将过期,磁阵目前读写缓慢解决过程.txt
  10. 基本数据类型与引用数据类型