PTA 栈和队列练习

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()

输入格式

输入首先给出两个正整数N1N2,表示堆栈S1S2的最大容量。随后给出一系列的队列操作: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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值