循环队列的基本操作及C语言代码实现
- 作者: 那晚越女说我?
- 来源: 51数据库
- 2022-09-29
1. 循环队列的初始化
我们初始化相比链表而言更为简单了,核心就在于申请空间以及将front指针和rear指针内容赋值为0,即指向第0个元素即可(注意第 0个元素内容为空)。
其代码可以表示为:
1 2 3 4 5 6 7 8 9 10 | //初始化 cir_queue *init(){ cir_queue *q = (cir_queue*) malloc ( sizeof (cir_queue)); if (q==NULL){ exit (0); //申请内存失败,退出程序 } q->front=0; q->rear=0; return q; } |
2. 循环队列入队操作
入队操作同顺序队列的方法,直接将rear向后移动即可,但是要注意判断,如果rear达到了队列的空间上线,将要从头继续开始移动,这里推荐使用余数法,即无论如何求余都是在这片空间内进行操作,防止一次错误执行就直接整体崩溃,而且也相对而言更为简洁,不推荐使用if语句,这样显得比较累赘。
注意进行加一移动位置操作的时候,不能直接q->rear++这样的操作,这样计算机判断优先级会产生让自己意想不到的后果,此外这里还需要进行一次是否队列已满的判断,当我们rear指针的下一个位置就是front的位置的时候,即改循环队列已满。
如图:
其代码可以表示为:
1 2 3 4 5 6 7 8 9 10 | //入队操作push void push(cir_queue *q, int data){ if ((q->rear+1)%maxsize==q->front){ printf ( "溢出,无法入队\n" ); return ; } else { q->rear=(q->rear+1)%maxsize; q->data[q->rear]=data; } } |
3. 循环队列出队操作
如果顺序队列的出队操作,直接将front进行后移一位即可,注意这时候有一个需要留意的地方,即队列是否为空,当队列为空的时候是无法进行出队操作的。
其代码可以表示为:
1 2 3 4 5 6 7 8 9 10 | //出队操作pop void pop(cir_queue *q){ if (q->rear==q->front){ printf ( "队列为空,无法出队\n" ); return ; } else { q->data[q->front]=0; q->front=(q->front+1)%maxsize; } } |
4. 循环队列遍历操作
遍历操作需要借助一个临时变量储存位置front的位置信息,利用i逐步向后移动,直到i到达了rear的位置即可宣告遍历的结束。
1 2 3 4 5 6 7 8 9 | //遍历队列 void print(cir_queue *q){ int i=q->front; while (i!=q->rear){ i=(i+1)%maxsize; printf ( "%d\t" ,q->data[i]); } printf ( "\n" ); //记得换行 } |
5. 本题代码代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<stdio.h> #include<stdlib.h> #include<cstring> #define maxsize 10 //表示循环队列的最大容量 //循环队列的结构设计 typedef struct cir_queue{ int data[maxsize]; int rear; int front; }cir_queue; //初始化 cir_queue *init(){ cir_queue *q = (cir_queue*) malloc ( sizeof (cir_queue)); if (q==NULL){ exit (0); //申请内存失败,退出程序 } memset (q->data,0, sizeof (q->data)); q->front=0; q->rear=0; return q; } //入队操作push void push(cir_queue *q, int data){ if ((q->rear+1)%maxsize==q->front){ printf ( "溢出,无法入队\n" ); return ; } else { q->rear=(q->rear+1)%maxsize; q->data[q->rear]=data; } } //出队操作pop void pop(cir_queue *q){ if (q->rear==q->front){ printf ( "队列为空,无法出队\n" ); return ; } else { q->data[q->front]=0; q->front=(q->front+1)%maxsize; } } //遍历队列 void print(cir_queue *q){ int i=q->front; while (i!=q->rear){ i=(i+1)%maxsize; printf ( "%d\t" ,q->data[i]); } printf ( "\n" ); //记得换行 } int main(){ cir_queue *q = init(); ////////////入队操作/////////////// printf ( "入队操作\n" ); for ( int i=1;i<=6;i++){ push(q,i); } print(q); ////////////出队操作/////////////// printf ( "出队操作\n" ); for ( int i=1;i<=3;i++){ pop(q); print(q); } return 0; } |
推荐阅读
热点文章
检查拆分键盘
0
带有“上一个"的工具栏和“下一个"用于键盘输入AccessoryView
0
Activity 启动时显示软键盘
0
UIWebView 键盘 - 摆脱“上一个/下一个/完成"酒吧
0
在 iOS7 中边缘滑动时,使键盘与 UIView 同步动画
0
我的 iOS 应用程序中的键盘在 iPhone 6 上太高了.如何在 XCode 中调整键盘的分辨率?
0
android:inputType="textEmailAddress";- '@' 键和 '.com' 键?
0
禁用 iPhone 中键盘的方向
0
Android 2.3 模拟器上的印地语键盘问题
0
keyDown 没有被调用
0