這篇文章主要介紹了使用C語言來解決循環隊列問題的方法,來自ACM的練習題實例,需要的朋友可以參考下
題目描述:
大家都知道數據結構里面有一個結構叫做循環隊列。顧名思義,這是一個隊列,并且是循環的。但是現在,淘氣的囧哥給這個循環隊列加上了一些規矩,其中有5條指令:
(1) Push K, 讓元素K進隊列。
(2) Pop,對頭元素出隊列。
(3) Query K,查找隊列中第K個元素,注意K的合法性。
(4) Isempty,判斷隊列是否為空。
(5) Isfull,判斷隊列是否已滿。
現在有N行指令,并且告訴你隊列大小是M。
輸入:
第一行包含兩個整數N和M。1<=N,M<=100000。
接下來有N行,表示指令,指令格式見題目描述。
其中元素均在int范圍。
輸出:
對于指令(1),若隊列已滿,輸出failed,否則不做輸出。
對于指令(2),若隊列已空,輸出failed,否則不做輸出。
對于指令(3),輸出隊列中第K個元素,若不存在,輸出failed。
對于指令(4)和(5),則用yes或者no回答。
詳情見樣例。
樣例輸入:
12 2Push 1Push 2Push 3Query 2Query 3IsemptyIsfullPopPopPopIsemptyIsfull
樣例輸出:
failed2failednoyesfailedyesno
AC代碼:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define queuesize 100001 //最大隊列長度
- struct queue
- {
- int front;
- int rear;
- int data[queuesize];
- int count; //記錄隊列中的元素
- };
- void InitQueue(struct queue *Q);
- void EnQueue(struct queue *Q, int element, int m);
- void Dequeue(struct queue *Q, int m);
- void QueueSearch(struct queue *Q, int k, int m);
- int main()
- {
- int n, m, i, element, k, flag;
- char command[10];
- while(scanf("%d%d",&n, &m) != EOF)
- {
- if(n < 1 || m > 100000)
- return 0;
- struct queue *Q;
- Q = malloc(sizeof(struct queue));
- InitQueue(Q);
- for(i = 0; i < n; i ++)
- {
- scanf("%s",command);
- if (strcmp(command,"Push") == 0)
- {
- scanf("%d",&element);
- EnQueue(Q, element, m);
- }else if (strcmp(command,"Pop") == 0)
- {
- Dequeue(Q, m);
- }else if (strcmp(command,"Query") == 0)
- {
- scanf("%d",&k);
- QueueSearch(Q, k, m);
- }else if (strcmp(command,"Isempty") == 0)
- {
- flag = (Q -> count == 0)? 1 : 0;
- if(flag)
- {
- printf("yes/n");
- }else
- {
- printf("no/n");
- }
- }else if (strcmp(command,"Isfull") == 0)
- {
- flag = (Q -> count == m)? 1 : 0;
- if(flag)
- {
- printf("yes/n");
- }else
- {
- printf("no/n");
- }
- }
- }
- }
- return 0;
- }
- /**
- * Description:隊列初始化
- */
- void InitQueue(struct queue *Q)
- {
- Q -> front = Q -> rear = 0;
- Q -> count = 0;
- }
- /**
- * Description:入隊操作
- */
- void EnQueue(struct queue *Q, int element, int m)
- {
- int flag;
- flag = (Q -> count == m)? 1 : 0;
- if(!flag)
- {
- Q -> data[Q -> rear] = element;
- Q -> count ++;
- Q -> rear = (Q -> rear + 1) % m;
- }else
- {
- printf("failed/n");
- }
- }
- /**
- * Description:出隊操作
- */
- void Dequeue(struct queue *Q, int m)
- {
- int flag;
- int element;
- flag = (Q -> count == 0)? 1 : 0;
- if(!flag)
- {
- element = Q -> data[Q -> front];
- Q -> front = (Q -> front + 1) % m;
- Q -> count --;
- }else
- {
- printf("failed/n");
- }
- }
- /**
- * Description:查找隊列中的指定元素
- */
- void QueueSearch(struct queue *Q, int k, int m)
- {
- int flag, temp;
- flag = (Q -> count == 0)? 1: 0;
- temp = Q -> front + k - 1;
- if((!flag) && (k <= m && k >= 1))
- {
- if((Q -> front < Q -> rear) && ( Q-> front <= temp && Q -> rear > temp))
- printf("%d/n",Q -> data[temp]);
- else if((Q -> front > Q -> rear) && (temp >= Q -> front || temp < Q->rear))
- printf("%d/n",Q -> data[temp]);
- else if(Q -> front == Q -> rear)
- printf("%d/n",Q -> data[temp]);
- else
- printf("failed/n");
- }else
- {
- printf("failed/n");
- }
- }
新聞熱點
疑難解答