PTA 栈和队列练习
7-1 堆栈模拟队列 (50分)
题目描述
设已知有两个堆栈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
Code
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int maxn=1e3+10;
struct Stack
{
int size;
int data[maxn];
int top;
Stack()
{
memset(data,0,sizeof(data));
top = 0;
size = 0;
}
}S1,S2;
int str2int(string s)
{
int ans = 0;
int len = s.length();
for(int i=0;i<len;i++)
{
ans = ans*10 + (s[i]-'0');
}
return ans;
}
/***********
* Stack *
***********/
int IsFull(Stack S); //判断是否栈满
int IsEmpty (Stack S); //判断是否栈空
void Push(Stack& S, int item); //入栈
int Pop(Stack& S); //出栈
/***********
* Queue *
***********/
void AddQ(int x);
int DeleteQ();
int main()
{
int N1,N2;
cin>>N1>>N2;
S1.size = S2.size = min(N1,N2);
string s;
while(cin>>s && s!="T")
{
if(s == "A")
{
cin>>s;
AddQ(str2int(s));
}else
{
int tmp = -1;
tmp = DeleteQ();
if(tmp == -1) printf("ERROR:Empty\n");
else printf("%d\n",tmp);
}
}
return 0;
}
int IsFull(Stack S)
{
return S.top == S.size ? 1 : 0;
}
int IsEmpty (Stack S)
{
return S.top == 0 ? 1 : 0;
}
void Push(Stack& S, int item)
{
S.top++;
S.data[S.top] = item;
}
int Pop(Stack& S)
{
int tmp = S.data[S.top];
S.data[S.top] = 0;
S.top--;
return tmp;
}
void AddQ(int x)
{
if(IsFull(S1) && !IsEmpty(S2))
{
printf("ERROR:Full\n");
return;
}
if(IsFull(S1) && IsEmpty(S2))
{
while(!IsEmpty(S1))
{
Push(S2,Pop(S1));
}
}
Push(S1,x);
}
int DeleteQ()
{
int tmp;
if(IsEmpty(S1) && IsEmpty(S2))
{
return -1;
}
if(IsEmpty(S2))
{
while(!IsEmpty(S1))
{
Push(S2,Pop(S1));
}
}
tmp = Pop(S2);
return tmp;
}
7-2 银行业务队列简单模拟 (50分)
题目描述
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
输入格式
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出格式
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入样例
8 2 1 3 9 4 11 13 15
输出样例
1 3 2 9 11 4 13 15
Code
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1e3+10;
class Queue
{
private:
int front;
int rear;
int data[maxn];
public:
Queue()
{
front = 0;
rear = 0;
memset(data,0,sizeof(data));
}
void push(int x)
{
data[rear] = x;
rear++;
}
int pop()
{
int tmp = -1;
if(front != rear)
{
tmp = data[front];
data[front] = 0;
front++;
}
return tmp;
}
bool empty()
{
return front == rear ? true : false;
}
};
int main()
{
Queue Q1,Q2;
int n,a;
scanf("%d",&n);
while(n--)
{
scanf("%d",&a);
if(a%2!=0)
{
Q1.push(a);
}else
{
Q2.push(a);
}
}
int tmp;
int flag = false;
while(!Q1.empty() || !Q2.empty())
{
tmp = Q1.pop();
if(tmp != -1)
{
if(flag) printf(" %d",tmp);
else printf("%d",tmp);
flag = true;
}
tmp = Q1.pop();
if(tmp != -1)
{
if(flag) printf(" %d",tmp);
else printf("%d",tmp);
flag = true;
}
tmp = Q2.pop();
if(tmp != -1)
{
if(flag) printf(" %d",tmp);
else printf("%d",tmp);
flag = true;
}
}
printf("\n");
return 0;
}