循环队列的实现方法
来源:互联网 发布:淘宝达人简介怎么写 编辑:程序博客网 时间:2024/05/22 04:43
//C实现方式
#include <stdio.h> 2. #include <stdlib.h>3. #include <stdbool.h>4.5. #define Q_LEN 66.7. typedef struct {8. int *pBase;9. int front;10. int rear;11.}QUEUE;12.13. static void init(QUEUE *pQ) {14. pQ->pBase = (int *)malloc(sizeof(int) * Q_LEN);15. pQ->front = 0;16. pQ->rear = 0;17.}18.19. static inline bool full_queue(QUEUE *pQ) {20. if((pQ->rear + 1) % Q_LEN == pQ->front)21. return true;22. else23. return false;24.}25.26. static bool en_queue(QUEUE *pQ, int val) {27. if (full_queue(pQ)) {28. printf("队列已满, %d 不能被加入队列\n", val);29. return false;30. } else {31. pQ->pBase[pQ->rear] = val;32. pQ->rear = (pQ->rear + 1) % Q_LEN;33. return true;34. }35.}36.37. static void traverse_queue(QUEUE *pQ) {38. int idx = pQ->front;39. while (idx != pQ->rear) {40. printf("%d ", pQ->pBase[idx]);41. idx = (idx + 1) % Q_LEN;42. }43. printf("\n");44.}45.46. static inline bool emput_queue(QUEUE *pQ) {47. if (pQ->front == pQ->rear) {48. return true;49. } else {50. return false;51. }52.}53.54. static bool out_queue(QUEUE *pQ, int *pVal) {55. if (emput_queue(pQ)) { 56. return false;57. } else {58. *pVal = pQ->pBase[pQ->front];59. pQ->front = (pQ->front + 1) % Q_LEN;60. return true;61. }62.}63.64.int main(void) {65. QUEUE Q;66. int val;67.68. init(&Q);69. en_queue(&Q, 1);70. en_queue(&Q, 2);71. en_queue(&Q, 3);72. en_queue(&Q, 4);73. en_queue(&Q, 5);74. en_queue(&Q, 6);75. en_queue(&Q, 7);76. en_queue(&Q, 8);77.78. traverse_queue(&Q);79.80. if (out_queue(&Q, &val)) {81. printf("出队成功,队列出队的元素是: %d\n", val);82. } else {83. printf("出队失败!\n");84. }85.86. traverse_queue(&Q);87.88. free(Q.pBase);89. return 0;90.}
C++实现:
队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。
队列有下面几个操作:
- InitQueue() ——初始化队列
- EnQueue() ——进队列
- DeQueue() ——出队列
- IsQueueEmpty()——判断队列是否为空
- IsQueueFull() ——判断队列是否已满
队列可以由数组和链表两种形式实现队列操作(c语言),下面仅以数组为例:
数组实现:
队列数据结构
typedef struct queue{ int queuesize; //数组的大小 int head, tail; //队列的头和尾下标 int *q; //数组头指针}Queue;
InitQueue() ——初始化队列
void InitQueue(Queue *q){ q->queuesize = 8; q->q = (int *)malloc(sizeof(int) * q->queuesize); //分配内存 q->tail = 0; q->head = 0;}
这样有个缺陷,空间利用率不高。采用循环队列:
EnQueue() ——进队列
void EnQueue(Queue *q, int key){ int tail = (q->tail+1) % q->queuesize; //取余保证,当quil=queuesize-1时,再转回0 if (tail == q->head) //此时队列没有空间 { printf("the queue has been filled full!"); } else { q->q[q->tail] = key; q->tail = tail; }}
DeQueue() ——出队列
int DeQueue(Queue *q){ int tmp; if(q->tail == q->head) //判断队列不为空 { printf("the queue is NULL\n"); } else { tmp = q->q[q->head]; q->head = (q->head+1) % q->queuesize; } return tmp;}
IsQueueEmpty()——判断队列是否为空
int IsQueueEmpty(Queue *q){ if(q->head == q->tail) { return 1; } else { return 0; }}
IsQueueFull()——判断队列是否已满
int IsQueueFull(Queue *q){ if((q->tail+1)% q->queuesize == q->head) { return 1; } else { return 0; }}
0 0
- 循环队列的实现方法
- 用循环数组实现队列的方法
- 队列----循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- Mysql 5.7密码过期修改密码
- 树状数组
- Kinect入门(1)——显示彩色图像数据流
- Android开发在string.xml文件中设置部分字体颜色大小
- 图像拼接
- 循环队列的实现方法
- IOS根据两个经纬度计算相距距离
- C# 根据图片生成缩略图.直接输出到客户端.
- 机器学习那些事——文本挖掘中的特征提取
- 使用 Spring 进行单元测试
- 从PowerDesigner概念设计模型(CDM)中的3种实体关系说起
- Algorithms—18.4Sum
- JavaDoc文档编写学习
- 2.仿微信--登录界面(LoginActivity)布局界面的实现