不一樣的迴圈隊列

來源:互聯網
上載者:User
起因在九度ac了一道還算不錯的隊列題目,記錄一下,數組實現的迴圈隊列
題目描述:

大家都知道資料結構裡面有一個結構叫做迴圈隊列。顧名思義,這是一個隊列,並且是迴圈的。但是現在,淘氣的囧哥給這個迴圈隊列加上了一些規矩,其中有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]);elseprintf("failed\n");}else{printf("failed\n");}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.