不一样的循环队列
起因在九度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
#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");}}