队列的实现
来源:互联网 发布:floyd 算法 编辑:程序博客网 时间:2024/06/06 10:43
队列的实现
队列实现跟栈相似,有两种实现方式,一种是用链表实现,一种使用数组实现。为了使这两种实现方法具有相同的函数接口,将函数的原型声明放到queue.h文件中。
编译环境:Visual Studio 2010
fatal.h用于定义错误处理方法
#include <stdio.h>#include <stdlib.h>#define FatalError(str) fprintf(stderr, "%s\n", str),exit(1)queue.h用于声明队列的函数原型
#ifndef QUEUE_H#define QUEUE_Htypedef int ElementType;struct QueueRecord;typedef struct QueueRecord *Queue;Queue CreateQueue(void);void DestoryQueue(Queue Q);void ClearQueue(Queue Q);int QueueLength(Queue Q);int IsEmpty(Queue Q);int IsFull(Queue Q);ElementType Head(Queue Q);ElementType Dequeue(Queue Q);void Enqueue(ElementType X, Queue Q);#endif1. 队列的链式实现
链式实现可以有头结点也可以没有头节点,我在这里的实现方式是没有头节点的。如下图所示
queue.c队列的具体实现
#include "fatal.h"#include "queue.h"struct Node{ElementType Data;struct Node *Next;};typedef struct Node *PtrToNode;struct QueueRecord{PtrToNode Front;//队头指针PtrToNode Rear; //队尾指针};Queue CreateQueue(void){Queue Q;Q = (Queue)malloc(sizeof(struct QueueRecord));if(Q == NULL)FatalError("Out of space");Q->Front = Q->Rear = NULL;return Q;}void DestoryQueue(Queue Q){PtrToNode TmpCell;while(Q->Front){TmpCell = Q->Front->Next;free(Q->Front);Q->Front = TmpCell;}free(Q);}void ClearQueue(Queue Q){PtrToNode P, TmpCell;P = Q->Front;Q->Front = NULL;Q->Rear = Q->Front;while(P){TmpCell = P->Next;free(P);P = TmpCell;}}int QueueLength(Queue Q){int cnt = 0;PtrToNode P;P = Q->Front;while(P){++cnt;P = P->Next;}return cnt;}int IsEmpty(Queue Q){return Q->Front == NULL;}int IsFull(Queue Q){return 0;}ElementType Head(Queue Q){return IsEmpty(Q) ? -1 : Q->Front->Data;}ElementType Dequeue(Queue Q){ElementType X = -1;PtrToNode TmpCell;if(!IsEmpty(Q)){TmpCell = Q->Front;Q->Front = TmpCell->Next;X = TmpCell->Data;if(TmpCell == Q->Rear)Q->Rear = Q->Front;free(TmpCell);}return X;}void Enqueue(ElementType X, Queue Q){PtrToNode TmpCell;TmpCell = (PtrToNode)malloc(sizeof(struct Node));if(TmpCell == NULL)FatalError("Out of space");TmpCell->Data = X;TmpCell->Next = NULL;if(IsEmpty(Q))//如果此前为空队列,插入新元素后要求头结点的位置{Q->Front = TmpCell;Q->Rear = TmpCell;}elseQ->Rear->Next = TmpCell;Q->Rear = TmpCell;}2. 队列的数组实现
预留数组中的一个空间用来判断队列是否已满。数组实现的是循环队列,如下图所示
queue.c队列的数组实现
#include "fatal.h"#include "queue.h"#define MAXQSIZE 100struct QueueRecord{ElementType *Array;int Front;int Rear;int Capacity;};Queue CreateQueue(void){Queue Q;Q = (Queue)malloc(sizeof(struct QueueRecord));if(Q == NULL)FatalError("Out of space");Q->Array = (ElementType *)malloc(sizeof(ElementType) * MAXQSIZE);if(Q->Array == NULL)FatalError("Out of space");Q->Front = 0;Q->Rear = 0;Q->Capacity = MAXQSIZE;return Q;}void DestoryQueue(Queue Q){free(Q->Array);free(Q);}void ClearQueue(Queue Q){Q->Front = Q->Rear = 0;}int QueueLength(Queue Q){return (Q->Rear - Q->Front + Q->Capacity) % Q->Capacity;}int IsEmpty(Queue Q){return Q->Front == Q->Rear;}int IsFull(Queue Q){return (Q->Rear + 1) % Q->Capacity == Q->Front;}ElementType Head(Queue Q){ElementType X;if(IsEmpty(Q))FatalError("Empty queue");return Q->Array[Q->Front];}void Enqueue(ElementType X, Queue Q){if(IsFull(Q))FatalError("Out of space");Q->Array[Q->Rear] = X;Q->Rear = (Q->Rear + 1) % Q->Capacity;}ElementType Dequeue(Queue Q){ElementType X;if(IsEmpty(Q))FatalError("Empty queue");X = Q->Array[Q->Front];Q->Front++;if(Q->Front == Q->Capacity)Q->Front = 0;return X;}queuemain.c队列测试
#include <stdio.h>#include "queue.h"int main(void){Queue Q;int i;Q = CreateQueue();for(i = 0; i < 10; i++)Enqueue(i, Q);while(!IsEmpty(Q) && i < 15){printf("%d ", Head(Q));Dequeue(Q);++i;}putchar('\n');for(; i< 20; ++i)Enqueue(i, Q);while(!IsEmpty(Q))printf("%d ", Dequeue(Q));putchar('\n');DestoryQueue(Q);Q = CreateQueue();for(i = 20; i <= 30; i++)Enqueue(i, Q);while(!IsEmpty(Q))printf("%d ", Dequeue(Q));return 0;}
测试结果,如下图所示
- 队列的实现:顺序队列
- 队列的实现:链式队列
- 队列----循环队列的实现
- 队列实现 队列的链式结构实现
- 堆栈,队列的实现
- 链队列的实现
- 队列的实现
- 队列的实现
- java 实现的队列
- 工作队列的实现
- 工作队列的实现
- 用链表实现的队列
- 队列的实现
- 队列的实现
- 队列的实现
- 队列的数组实现
- 循环队列的实现
- 数据结构 队列的实现
- ORACLE: 查询(看)表的主键、外键、唯一性约束和索引
- 大端存数和小端存数模式详解
- android锁屏软件屏蔽状态栏下拉
- hdu 4007 Dave (2011年大连ACM网络赛)
- Windows7 UAC
- 队列的实现
- String类总结02-----黑马程序员
- 行为型模式-----策略模式(Strategy)
- CSR8811 bluetooth debug summary
- Android Fragment完全解析及:: Android手机平板使用Fragment实现兼容手机和平板的程序
- JSF运行流程和生命周期介绍
- iOS 开发 中级:HTTP请求 GET POST 网络编程实现
- hdu1874畅通工程续 (dijkstra)
- android:tag与android:id的区别