順序隊列是隊列的順序存儲結構,順序隊列實際上是運算受限的順序表。和順序表一樣,順序隊列用一個向量空間來存放當前隊列中的元素。由于隊列的隊頭和隊尾的位置是變化的,設置兩個指針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;
}