7-3 堆栈模拟队列
分数 25
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
设已知有两个堆栈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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
用小堆栈做入队列,大堆栈作出队列;入队列第一次满的时候将入队列注入出队列中,而后当入队列满了并且出队列不为空时,则判定队满,输出FULL。
完整代码:
#include <bits/stdc++.h>
using namespace std;
struct Stack
{
int max;
int dev;
int a[100005];
}S1,S2;
int IsFull(Stack &S)
{
if(S.dev > S.max)
{
return 1;
}
else return 0;
}
int IsEmpty(Stack &S)
{
if(S.dev == 0)
{
return 1;
}
else return 0;
}
void Push(Stack &S,int item)
{
S.a[S.dev++] = item;
return ;
}
int Pop(Stack &S)
{
S.dev --;
return S.a[S.dev];
}
void AddQ(int item)
{
if(!IsFull(S1))
{
Push(S1,item);
}
else if(IsFull(S1) && IsEmpty(S2))
{
while(!IsEmpty(S1))
{
Push(S2,Pop(S1));
}
Push(S1,item);
}
else
{
cout << "ERROR:Full" << endl;
}
// cout << "dev:" << S1.dev << " " << S2.dev <<endl;
return ;
}
int DeleteQ()
{
if(!IsEmpty(S2))
{
return Pop(S2);
}
else if(!IsEmpty(S1))
{
while(!IsEmpty(S1))
{
Push(S2,Pop(S1));
}
return Pop(S2);
}
}
int main()
{
int n1,n2;
cin >> n1 >> n2;
getchar();
if(n1 > n2) swap(n1,n2);
S1.max = n1-1; S1.dev = 0;
S2.max = n2-1; S2.dev = 0;
// cout << S1.max << " " << S2.max << endl;
char c;
while(cin>>c && c != 'T')
{
if(c == 'A')
{
int t;
cin >> t;
AddQ(t);
}
else if(c == 'D')
{
if(IsEmpty(S1) && IsEmpty(S2)) cout << "ERROR:Empty" << endl;
else cout << DeleteQ() << endl;
}
}
return 0;
}