队列的数组实现

来源:互联网 发布:桌面版windows手机 编辑:程序博客网 时间:2024/05/17 08:27

数据结构与算法分析——c语言描述 第三章  队列的数组实现

注意rear和front初始化的赋值。


queue.h

typedef int ElementType;#ifndef _Queue_h#define _Queue_hstruct QueueRecord;typedef struct QueueRecord *Queue;int isEmpty(Queue q);int isFull(Queue q);Queue createQueue(int maxElements);void disposeQueue(Queue q);void makeEmpty(Queue q);void enqueue(ElementType X, Queue q);ElementType front(Queue q);void dequeue(Queue q);ElementType frontAndDequeue(Queue q);#endif  


queue.c

#include"queue.h"#include"fatal.h"#include<stdlib.h>#defineMinQueueSize (5)struct QueueRecord{int capacity;int front;int rear;int size;ElementType *array;};int isEmpty(Queue q) {return q->size == 0;}int isFull(Queue q) {return q->size == q->capacity;}Queue createQueue(int maxElements) {if (maxElements < MinQueueSize)Error("Queue size is too small");Queue q = malloc(sizeof(struct QueueRecord));if (q == NULL)Error("out of memory");q->array = malloc(maxElements*sizeof(ElementType));if(q->array==NULL)Error("out of memory");q->capacity = maxElements;makeEmpty(q);return q;}void makeEmpty(Queue q) {q->size = 0;q->front = 1;//这个是重点啊,当增加一个元素之后,rear和front同时都是1q->rear = 0;}void enqueue(ElementType X, Queue q) {if (isFull(q))Error("queue is full");q->size++;q->rear = (q->rear + 1) % q->capacity;q->array[q->rear] = X;}ElementType front(Queue q) {if (isEmpty(q))Error("queue is empty");return q->array[q->front];}void dequeue(Queue q) {if (isEmpty(q))Error("queue is empty");q->size--;q->front = (q->front + 1) % q->capacity;}ElementType frontAndDequeue(Queue q) {ElementType x = front(q);dequeue(q);return x;}

main.c

#include<stdlib.h>#include<stdio.h>#include"queue.h"int main() {Queue q = createQueue(50);for (int i = 0; i < 8; i++){enqueue(i, q);}printf("%d\n", frontAndDequeue(q));printf("%d\n", frontAndDequeue(q));printf("%d\n", frontAndDequeue(q));}


2 0