队列
2015-12-30 11:33
344 查看
队列:Queue FIFO
队首(front)允许删除的一端
队尾(rear)允许插入的一端
静态队列: 使用数组存储,设立一个队首指针front,一个队尾指针rear,
front = rear = 0;
1、入队 rear + 1
2、出队 front + 1 ,返回出队元素
3、空队列 front = rear;
4、rear = MAX_QUEUE_SIZE - 1或front = rear;
循环队列:用来克服队列“假溢出”现象(front和rear只加不减,有可能超过指针上界)
1、当队首或队尾指针指向向量上界(MAX_QUEUE_SIZE - 1), + 1操作变为指向向量下界0
2、只用front = rear,不能判断是空队列,还是满队列
3、循环队列满:(rear + 1)%MAX_QUEUE_SIZE = front
队列的链式存储:单链表,需要两种结点,一种是数据结点,一种是队首队尾指针的结点
队首(front)允许删除的一端
队尾(rear)允许插入的一端
静态队列: 使用数组存储,设立一个队首指针front,一个队尾指针rear,
front = rear = 0;
1、入队 rear + 1
2、出队 front + 1 ,返回出队元素
3、空队列 front = rear;
4、rear = MAX_QUEUE_SIZE - 1或front = rear;
循环队列:用来克服队列“假溢出”现象(front和rear只加不减,有可能超过指针上界)
1、当队首或队尾指针指向向量上界(MAX_QUEUE_SIZE - 1), + 1操作变为指向向量下界0
2、只用front = rear,不能判断是空队列,还是满队列
3、循环队列满:(rear + 1)%MAX_QUEUE_SIZE = front
#include <stdio.h> #include <stdlib.h> #define MAX_QUEUE_SIZE 5 #define ERR -1 #define OK 0 typedef int ElemType; typedef struct SqQueue { ElemType Queue_array[MAX_QUEUE_SIZE]; int front; int rear; }; SqQueue Init_CirQueue() { SqQueue q; q.front = q.rear = 0; return q; } int Push_CirQueue(SqQueue *s, ElemType e) { if ((s->rear + 1) % MAX_QUEUE_SIZE == s->front) //栈满 { return ERR; } s->Queue_array[s->rear] = e; s->rear = (s->rear + 1) % MAX_QUEUE_SIZE; return OK; } int Pop_CirQueue(SqQueue *q, ElemType *e) { if (q->front + 1 == q->rear) { return ERR; } *e = q->Queue_array[q->front]; q->front = (q->front + 1) % MAX_QUEUE_SIZE; return OK; } int main(void) { SqQueue cirQ = Init_CirQueue(); for (int i = 0; i < 5; i++) { Push_CirQueue(&cirQ, i); } system("pause"); return 0; }
队列的链式存储:单链表,需要两种结点,一种是数据结点,一种是队首队尾指针的结点
typedef struct QNode { ElemType data; struct QNode *next; }; typedef struct link_queue { QNode *front; QNode *rear; }Link_Queue; Link_Queue* Init_Qnode() { QNode *p; Link_Queue *q; p = (QNode*)malloc(sizeof(QNode)); p->next = NULL; q = (Link_Queue *)malloc(sizeof(Link_Queue)); q->front = q->rear = p; return q; } int Insert_Link_Queue(Link_Queue *q, ElemType e) { QNode *p; if (q) { return ERR; } p = (QNode*)malloc(sizeof(QNode)); p->data = e; p->next = NULL; //p->next = q->rear->next; q->rear->next = p; q->rear = q->rear->next; return OK; } int Delete_Link_Queue(Link_Queue *q, ElemType *e) { QNode *p; p = q->front->next; if (q->front == q->rear) { return ERR; } *e = p->data; q->front->next = p->next; if (p == q->rear)//如果只有一个结点因为出栈只能时Q->FRONT,既此时q->front和q->rear相等 { q->rear == q->front; } free(p); return OK; } void Destroy_LinkQueue(Link_Queue *q) { while (q->front != NULL) { q->rear = q->front->next; free(q->front); q->front = q->rear; } }
相关文章推荐
- java枚举使用详解
- JavaEE_SSM_Mybatis_generator逆向工程的配置详解
- java实现屏蔽词功能
- LinuxBoot
- Mysql中文乱码问题完美解决方案
- 【解决办法】使用Cocos Code IDE 导出 Android 工程「执行命令出错,返回值:2。」
- 使用OWIN 为WebAPI 宿主 跨平台
- python Tab自动补全命令设置
- 调用startActivityForResult后,onActivityResult为什么立刻响应
- easyui-datagrid自动合并行
- 算法学习:看看深度优先搜索算法
- C#配置管理器选项区别
- MVC架构
- 内部Hybrid App经验解读
- 朋友决定你的视野
- Android Application的使用及其生命周期
- android不依赖具体activity弹出Dialog对话框,即全局性对话框
- Oracle--同义词相关
- NSUserDefaults 很详细的介绍使用(转发)
- JSON.parse()和JSON.stringify()使用介绍