使用C语言来解决循环队列问题的方法
题目描述:
大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有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"); } }
栏 目:C语言
下一篇:C语言中strspn()函数和strcspn()函数的对比使用
本文标题:使用C语言来解决循环队列问题的方法
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/2869.html
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言编写函数冒泡排序 c语言冒泡排序法函数
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-11ajax实现页面的局部加载
- 01-10SublimeText编译C开发环境设置
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文