顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表。和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应设置为0。
头文件 SqQueue.h
#ifndef _SQUEUE_H__
#define _SQUEUE_H__
#include "error.h"#define TRUE 1
#define FALSE 0#define SIZE 10
typedef int QueueData;
typedef struct _queue
{QueueData data[SIZE];int front; // 指向队头的下标int rear; // 指向队尾的下标
}Queue;// 置空队
int InitQueue (Queue* q);// 判队空否
int QueueEmpty (Queue* q);// 判队满否
int QueueFull (Queue* Q);// 进队
int EnQueue (Queue* q, QueueData x);// 出队
int DeQueue (Queue* s, QueueData *x);// 取队头
int GetFront (Queue* s, QueueData *x);#endif // _SQUEUE_H__
源文件 :SqQueue.c
#include "SqQueue.h"// 置空队
int InitQueue (Queue* q)
{if (NULL == q){errno = ERROR;return FALSE;}// 置空队q->front = 0;q->rear = 0;return TRUE;
}// 判队空否
int QueueEmpty (Queue* q)
{if (NULL == q){errno = ERROR;return FALSE;}return (q->front == q->rear);
}// 判队满否
int QueueFull (Queue* q)
{if (NULL == q){errno = ERROR;return FALSE;}return (q->front == (q->rear+1) % SIZE);
}// 进队
int EnQueue (Queue* q, QueueData x)
{if (NULL == q){errno = ERROR;return FALSE;}if (QueueFull(q)){errno = FULL_QUEUE;return FALSE;}q->data[(++q->rear) % SIZE] = x;return TRUE;
}// 出队
int DeQueue (Queue* q, QueueData *x)
{if (NULL == q){errno = ERROR;return FALSE;}if (QueueEmpty(q)){errno = EMPTY_QUEUE;return FALSE;}*x = q->data[(++q->front) % SIZE];return TRUE;
}// 取队头
int GetFrontf (Queue* q, QueueData *x)
{if (NULL == q){errno = ERROR;return FALSE;}if (QueueEmpty(q)){errno = EMPTY_QUEUE;return FALSE;}*x = q->data[(q->front + 1) % SIZE];return TRUE;
}
链式队列 链式队列没有空间溢出的问题
头文件 LinkQueue.h
#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
#include "error.h"#define TRUE 1
#define FALSE 0typedef int QueueData;
typedef struct _node
{QueueData data;struct _node* next;
}Node;typedef struct _queue
{Node* front;Node* rear;
}Queue;// 创建队列
Queue* Create_Queue ();// 置空队列
int QueueEmpty (Queue* q);// 进队
int EnQueue (Queue* q, QueueData x);// 出队
int DeQueue (Queue* q, QueueData *x);// 取队头
int GetFront (Queue* q, QueueData *x);// 销毁队列
int Destroy_Queue (Queue *q);#endif
源文件 LinkQueue.c
#include "LinkQueue.h"
#include <stdlib.h>// 创建队列
Queue* Create_Queue ()
{Queue* q = (Queue*) malloc(sizeof(Queue)/sizeof(char));if (NULL == q){errno = MALLOC_ERROR;return NULL;}// 置空队q->front = NULL;q->rear = NULL;return q;
}// 置空队
int QueueEmpty (Queue* q)
{if (NULL == q){errno = ERROR;return FALSE;}return q->front == NULL;
}// 进队
int EnQueue (Queue* q, QueueData x)
{if (NULL == q){errno = ERROR;return FALSE;}Node* node = (Node*) malloc(sizeof(Node)/sizeof(char));if (NULL == node){errno = MALLOC_ERROR;return FALSE;}node->data = x;node->next = NULL;if (NULL == q->front){q->front = node;q->rear = node;}else {q->rear->next = node;q->rear = node;}return TRUE;
}// 出队
int DeQueue (Queue* q, QueueData *x)
{if (NULL == q){errno = ERROR;return FALSE;}if (QueueEmpty(q)){errno = EMPTY_QUEUE;return FALSE;}Node* p = q->front;*x = p->data;q->front = p->next;free(p);if (NULL == q->front){q->rear = NULL;}return TRUE;}// 取队头
int GetFront (Queue* q, QueueData *x)
{if (NULL == q){errno = ERROR;return FALSE;}if (QueueEmpty(q)){errno = EMPTY_QUEUE;return FALSE;}*x = q->front->data;return TRUE;
}// 销毁队列
int Destroy_Queu (Queue* q)
{if (NULL == q){errno = ERROR;return FALSE;}int x;while (TRUE != QueueEmpty(q)){DeQueue (q, &x);}free(q);return TRUE;
}