循环队列
2016-06-12 16:30
405 查看
#include <stdio.h> /** * 时间:2016年6月12日 16:29:42 * 内容:循环队列 */ #define QueueSize 40// 队列的最大长度 typedef char DataType; /* * 设立一个标志位,比如说是flag * 最开始时队列为空,设flag=0 * 当入队的时候让flag=1 * 出队的时候flag=0 * 然后再加上判断队头队尾指针是否重合 * 重合,且flag=0,则为空 * 重合,且flag=1,则为满 */ typedef struct SCQueue { DataType queue[QueueSize]; int front/*队头指针*/,rear/*队尾指针*/,flag; }SCQueue; void InitQueue(SCQueue*);// 初始化队列 int QueueEmpty(SCQueue);// 判断队列是否为空 int EnterQueue(SCQueue*,DataType);// 入队 int DeleteQueue(SCQueue*,DataType*);// 删除队首 int getHead(SCQueue,DataType*); void ClearQueue(SCQueue*); int main(void) { SCQueue Q; int i,length=8; char str[]="ABCDEFGH"; char x; InitQueue(&Q); for (int i=0;i<length;i++) { if(EnterQueue(&Q,str[i])) printf("成功%d ", i+1); } printf("\n"); DeleteQueue(&Q,&x); printf("出队列的元素为:%c\n", x); // 事实上,哪怕出队列了,但是在第一个内存空间还是未被释放的. // 这种现象叫做"假溢出",会造成内存浪费,所以一般使用循环队列 printf("顺序队列中的元素为:"); if (!QueueEmpty(Q)) for (i=Q.front;i<Q.rear;i++) printf("%c ", Q.queue[i]); printf("\n"); return 0; } /** * 初始化队列 * @param SCQ 队列指针 */ void InitQueue(SCQueue* SCQ) { SCQ->front=0; SCQ->rear=0; SCQ->flag=0; } /** * 判断队列是否为空 * @param SCQ 队列指针 * @return 返回是否成功,成功为1,不成功为0 */ int QueueEmpty(SCQueue SCQ) { if (SCQ.front==SCQ.rear&&SCQ.flag==0) return 1; else return 0; } /** * 入队 * @param SCQ 队列指针 * @param x 插入元素 * @return 返回是否成功,成功为1,不成功为0 */ int EnterQueue(SCQueue* SCQ,DataType x) { if (SCQ->rear==SCQ->rear&&SCQ->flag==1) { printf("循环队列已满,不能入队!\n"); return 0; } else { SCQ->queue[SCQ->rear]=x; SCQ->rear+=1; SCQ->flag=1; return 1; } } /** * 删除队头指针 * @param SCQ 队列指针 * @param e 删除元素的值返回给*e * @return 返回是否成功,成功为1,不成功为0 */ int DeleteQueue(SCQueue* SCQ,DataType* e) { // 判断队列是否为空,一旦为空就不能删除队首 if (QueueEmpty(*SCQ)) { printf("循环队列已空,不能出队!\n"); return 0; } else { *e=SCQ->queue[SCQ->front]; SCQ->front+=1; SCQ->flag=0; return 1; } } int getHead(SCQueue SCQ,DataType* e) { if (SCQ.front==SCQ.rear&&SCQ.flag==0) return 0; else { *e=SCQ.queue[SCQ.front]; return 1; } } void ClearQueue(SCQueue* SCQ) { SCQ->front=0; SCQ->rear=0; SCQ->flag=0; }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 使用C语言来解决循环队列问题的方法
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- javascript中利用数组实现的循环队列代码
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force