循环队列(JSU-ZJJ)

题目描述

根据给定的空间构造顺序循环队列,规定队满处理方法为少用一个元素空间。例如,给定5个元素空间构造循环队列,则只能存放4个元素。试根据入队及出队操作判断队列最后的元素存放情况,并输出最后队列中的元素值,即完成给定入队及出列操作后一次性全部出队的元素值。要求采用顺序队列完成。

输入

输入的第一行为一个自然数n,表示要求构造的顺序循环队列空间数。第二行为操作次k,接下来k行为出队入队操作,每行各代表一次操作。入队用in表示,出队用out表示,如果是入队,则in隔一空格后为一整数,表示入队元素值。

输出

输出完成所有入队出队操作后,一次性出队元素。用一个空格隔开。可以假定队在完成所有操作后不为空。

样例输入 Copy

4
7
in 1
in 2
in 5
in 6
out
out
in 8

样例输出 Copy

5 8

分析:

本题的话是考察循环队列的应用。一开始,我以为队列满了,就覆盖第一个。后来发现不是这样的,他是如果队列满了,在遇到IN 就不要放进去了。
所以本题在PUSH时,要判断队列是否满了。然后本题的数据水了,IN 后面接的都是一位数的数字。

#include"stdio.h"
#include"string.h"
#define MAX_SIZE 10000
typedef struct {
 int data[MAX_SIZE];
 int front;
 int rear;
}SqQueue;
SqQueue Q;
int N;

void PUSH(int digit)
{
    if((Q.rear+1)%N!=Q.front)
    {Q.data[Q.rear]=digit;
     Q.rear++;
    }


}
void POP()
{

    Q.front++;


}
int main()
{
    int k,i,digit;
    char a[10],T;
    while(~scanf("%d",&N))
    {
        Q.front=0;
        Q.rear=0;

        scanf("%d",&k);
        scanf("%c",&T);
        for(i=1;i<=k;i++)
        {
            gets(a);
            if(a[0]=='i')
            {
                digit=a[3]-'0';
                PUSH(digit);

            }
            else
            {
                POP();

            }
        }
     if(Q.front>Q.rear)
        {for(i=Q.front;i<N-1;i++)
            printf("%d ",Q.data[i]);
        for(i=0;i<Q.rear-1;i++)
             printf("%d ",Q.data[i]);
        printf("%d\n",Q.data[i]);
        }
     else
     {
         for(i=Q.front;i<Q.rear-1;i++)
            printf("%d ",Q.data[i]);
         printf("%d\n",Q.data[i]);
     }


    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值