3-08. 栈模拟队列(25)(ZJU_PAT 模拟)
主题链接: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 |
1 |
| 2 |
3 2 |
ERROR:Full |
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的全部元素弹出压入s2
for(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;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
3-08. 栈模拟队列(25)(ZJU_PAT 模拟)的更多相关文章
- 剑指Offer——Java实现栈和队列的互模拟操作
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列 题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 思路:其实就是把队列正常入 ...
- PTA笔记 堆栈模拟队列+求前缀表达式的值
基础实验 3-2.5 堆栈模拟队列 (25 分) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Sta ...
- Java数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
- Python笔记_第二篇_面向过程_第二部分_2.路径、栈和队列、内存修改
这一部分分三个主题进行讲解,主要为后面的模块.包.第三方库的概念补充一些相关的内容. 1. 路径(Path): 相对路径和绝对路径. 举例1:我们先导入一个os库(模块)来观察一下路径 import ...
- 7-3 堆栈模拟队列(25 point(s)) 【数据结构】
7-3 堆栈模拟队列(25 point(s)) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stac ...
- JavaScript数组模拟栈和队列
*栈和队列:js中没有真正的栈和队列的类型 一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭 FILO 何时使用:今后只要仅希望数组只能从一端进 ...
- 【DataStructure In Python】Python模拟栈和队列
用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...
- python--递归(附利用栈和队列模拟递归)
博客地址:http://www.cnblogs.com/yudanqu/ 一.递归 递归调用:一个函数,调用的自身,称为递归调用 递归函数:一个可以调用自身的函数称为递归函数 凡是循环能干的事,递归都 ...
- php中数组模拟队列、栈的函数以及数组指针操作
1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...
随机推荐
- linux下使用vi操作
ESC : 进入命令模式 linux下使用vi后,怎样跳转到文件结尾 pagedown键连续按 虽然我也这么用,但还是太笨了.问了高手,方法是按shift+g,另外,到文件开头是gg. linux ...
- Web服务器Raspkate的RESTful API
基于轻量型Web服务器Raspkate的RESTful API的实现 在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RE ...
- Windows Phone开发(1):概论
原文:Windows Phone开发(1):概论 Windows Phone是微软公司开发的手机操作系统,这里就不多介绍,和Android,iPhone一样运行在智能手机上,相信大家都很熟悉. 目前来 ...
- STL algorithm算法minmax,minmax_element(36)
minmax原型: std::minmax C++11 C++14 default (1) template <class T> pair <const T&,const T ...
- 当执行游戏0xc000007b错误的解决方法
如图,这个错误使无数玩家烦恼. 出现这个错误,可能是硬件的问题,也可能是软件的问题.可是,因为硬件引起该问题的概率非常小,而且除了更换硬件之外没有更好的解决方法,因此本文将具体介绍怎样通过软件解决此问 ...
- C语言简单的菜单选项
#include <stdio.h> char get_choice(void); char get_first(void); int get_int(void); void count( ...
- C#四舍五入保留两位小数
- 安卓的sqlite增删改
基于安卓的sqlite增删改,笔记学习: 1.使用LinearLayout 布局生成,增删改的页面如图 代码布局如下: <LinearLayout xmlns:android="htt ...
- Android.mk参数解释
-------------------- 下面对Android.mk 中经常出现的变量进行讲解 -------------------- 这些变量,你会经常在Android.mk文件中见到,下面以字表 ...
- Greenplum+Hadoop学习笔记-14-定义数据库对象之创建与管理模式
6.3.创建与管理模式 概述:DB内组织对象的一种逻辑结构.一个DB内能够有多个模式.在未指定模式时默认放置在public中.能够通过"\dn"方式查看数据库中现有模式: test ...