1. 程式人生 > >迴圈佇列(JSU-ZJJ)

迴圈佇列(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]);
     }


    }
}