C语言实现链式队列、顺序队列和循环队列
队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 |
---|
循环队列
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。 |
---|
链式队列
链式队列是一种特殊的线性链表,这个链表你只能从表尾插入,从表头删除。
顺序队列
顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表。
common.h
#ifndef _COMMON_H_
#define _COMMON_H_
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>
#define ElemType int
void Swap(ElemType *a, ElemType *b)
{
ElemType tmp = *a;
*a = *b;
*b = tmp;
}
#endif /* _COMMON_H_ */
queue.h
#ifndef _QUEUE_H_
#define _QUEUE_H_
#include"common.h"
///
//顺序队列
#define SEQ_QUEUE_DEFAULT_SIZE 8
typedef struct SeqQueue
{
ElemType *base;
int capacity;
int front;
int rear;
}SeqQueue;
void SeqQueueInit(SeqQueue *psq);
bool SeqQueueIsFull(SeqQueue *psq);
bool SeqQueueIsEmpty(SeqQueue *psq);
void SeqQueueEnque(SeqQueue *psq, ElemType x);
void SeqQueueDeque(SeqQueue *psq);
ElemType SeqQueueFront(SeqQueue *psq);
void SeqQueuePrint(SeqQueue *psq);
void SeqQueueInit(SeqQueue *psq)
{
assert(psq != NULL);
psq->base = (ElemType*)malloc(sizeof(ElemType) * SEQ_QUEUE_DEFAULT_SIZE);
assert(psq->base != NULL);
psq->capacity = SEQ_QUEUE_DEFAULT_SIZE;
psq->front = psq->rear = 0;
}
bool SeqQueueIsFull(SeqQueue *psq)
{
assert(psq != NULL);
return psq->rear >= psq->capacity;
}
bool SeqQueueIsEmpty(SeqQueue *psq)
{
assert(psq != NULL);
return psq->front == psq->rear;
}
void SeqQueueEnque(SeqQueue *psq, ElemType x)
{
assert(psq != NULL);
if (SeqQueueIsFull(psq))
{
printf("队列已满, %d 不能入队.\n", x);
return;
}
psq->base[psq->rear++] = x;
}
void SeqQueueDeque(SeqQueue *psq)
{
assert(psq != NULL);
if (SeqQueueIsEmpty(psq))
{
printf("队列已空,不能出队.\n");
return;
}
psq->front++;
}
ElemType SeqQueueFront(SeqQueue *psq)
{
assert(psq != NULL);
if (SeqQueueIsEmpty(psq))
{
printf("队列已空,不能取对头元素.\n");
return;
}
return psq->base[psq->front];
}
void SeqQueuePrint(SeqQueue *psq)
{
assert(psq != NULL);
for (int i = psq->front; i < psq->rear; ++i)
printf("%d ", psq->base[i]);
printf("\n");
}
///
//循环队列
#define CIRCLE_QUEUE_DEFAULT_SIZE 8
#define CIRCLE_QUEUE_INC_SIZE 4
typedef struct CircleQueue
{
ElemType *base;
int capacity;
int front;
int rear;
}CircleQueue;
void CircleQueueInit(CircleQueue *psq);
bool CircleQueueIsFull(CircleQueue *psq);
bool CircleQueueIsEmpty(CircleQueue *psq);
void CircleQueueEnque(CircleQueue *psq, ElemType x);
void CircleQueueDeque(CircleQueue *psq);
ElemType CircleQueueFront(CircleQueue *psq);
void CircleQueuePrint(CircleQueue *psq);
void CircleQueueInit(CircleQueue *psq)
{
assert(psq != NULL);
psq->base = (ElemType*)malloc(sizeof(ElemType) * (CIRCLE_QUEUE_DEFAULT_SIZE + 1));
assert(psq->base != NULL);
psq->capacity = SEQ_QUEUE_DEFAULT_SIZE + 1;
psq->front = psq->rear = 0;
}
bool CircleQueueIsFull(CircleQueue *psq)
{
assert(psq != NULL);
return ((psq->rear + 1) % psq->capacity) == psq->front;
}
bool CircleQueueIsEmpty(CircleQueue *psq)
{
assert(psq != NULL);
return psq->front == psq->rear;
}
void CircleQueueEnque(CircleQueue *psq, ElemType x)
{
assert(psq != NULL);
if (CircleQueueIsFull(psq))
{
printf("循环队列已满, %d 不能入队.\n", x);
return;
}
psq->base[psq->rear] = x;
psq->rear = (psq->rear + 1) % psq->capacity;
}
void CircleQueueDeque(CircleQueue *psq)
{
assert(psq != NULL);
if (CircleQueueIsEmpty(psq))
{
printf("循环队列已空,不能出队.\n");
return;
}
psq->front = (psq->front + 1) % psq->capacity;
}
ElemType CircleQueueFront(CircleQueue *psq)
{
assert(psq != NULL);
if (CircleQueueIsEmpty(psq))
{
printf("循环队列已空,不能取对头元素.\n");
return;
}
return psq->base[psq->front];
}
void CircleQueuePrint(CircleQueue *psq)
{
assert(psq != NULL);
for (int i = psq->front; i != psq->rear;)
{
printf("%d ", psq->base[i]);
i = (i + 1) % psq->capacity;
}
printf("\n");
}
///
//链式队列
//#undef ElemType
typedef struct LinkQueueNode
{
ElemType data;
struct LinkQueueNode *link;
}LinkQueueNode;
typedef struct LinkQueue
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;
void LinkQueueInit(LinkQueue *pq);
void LinkQueueEnQue(LinkQueue *pq, ElemType x);
void LinkQueueDeQue(LinkQueue *pq);
void LinkQueuePrint(LinkQueue *pq);
bool LinkQueueEmpty(LinkQueue *pq);
ElemType LinkQueueFront(LinkQueue *pq);
void LinkQueueInit(LinkQueue *pq)
{
assert(pq != NULL);
pq->front = pq->rear = NULL;
}
void LinkQueueEnQue(LinkQueue *pq, ElemType x)
{
assert(pq != NULL);
LinkQueueNode *node = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
assert(node != NULL);
node->data = x;
node->link = NULL;
if (pq->front == NULL)
pq->front = pq->rear = node;
else
{
pq->rear->link = node;
pq->rear = node;
}
}
void LinkQueueDeQue(LinkQueue *pq)
{
assert(pq != NULL);
if (pq->front != NULL)
{
LinkQueueNode *p = pq->front;
pq->front = p->link;
free(p);
}
}
void LinkQueuePrint(LinkQueue *pq)
{
assert(pq != NULL);
LinkQueueNode *p = pq->front;
while (p != NULL)
{
printf("%d ", p->data);
p = p->link;
}
printf("\n");
}
bool LinkQueueEmpty(LinkQueue *pq)
{
return pq->front == NULL;
}
ElemType LinkQueueFront(LinkQueue *pq)
{
assert(pq->front != NULL);
return pq->front->data;
}
#endif /* _QUEUE_H_ */
SeqQueueMain.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"
void main()
{
SeqQueue Q;
SeqQueueInit(&Q);
SeqQueueEnque(&Q, 1);
SeqQueueEnque(&Q, 2);
SeqQueueEnque(&Q, 3);
SeqQueueEnque(&Q, 4);
SeqQueueEnque(&Q, 5);
SeqQueueEnque(&Q, 6);
SeqQueueEnque(&Q, 7);
SeqQueueEnque(&Q, 8);
SeqQueueEnque(&Q, 9);
SeqQueuePrint(&Q);
printf("队头 = %d\n", SeqQueueFront(&Q));
SeqQueueDeque(&Q);
SeqQueuePrint(&Q);
SeqQueueDeque(&Q);
SeqQueuePrint(&Q);
printf("队头 = %d\n", SeqQueueFront(&Q));
system("pause");
}
LinkQueueMain.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"
void main()
{
LinkQueue Q;
LinkQueueInit(&Q);
LinkQueueEnQue(&Q, 1);
LinkQueueEnQue(&Q, 2);
LinkQueueEnQue(&Q, 3);
LinkQueueEnQue(&Q, 4);
LinkQueuePrint(&Q);
ElemType val = LinkQueueFront(&Q);
LinkQueueDeQue(&Q);
printf("出队:%d\n", val);
LinkQueuePrint(&Q);
system("pause");
}
CircleQueueMain.h
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"
void main()
{
CircleQueue Q;
CircleQueueInit(&Q);
CircleQueueEnque(&Q, 1);
CircleQueueEnque(&Q, 2);
CircleQueueEnque(&Q, 3);
CircleQueueEnque(&Q, 4);
CircleQueueEnque(&Q, 5);
CircleQueueEnque(&Q, 6);
CircleQueueEnque(&Q, 7);
CircleQueueEnque(&Q, 8);
CircleQueuePrint(&Q);
printf("队头 = %d\n", CircleQueueFront(&Q));
CircleQueueDeque(&Q);
CircleQueueEnque(&Q, 9);
CircleQueuePrint(&Q);
printf("队头 = %d\n", CircleQueueFront(&Q));
system("pause");
}