队列数据结构(顺序表示-数组)C语言版

1.Queue.h头文件

#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 5
typedef struct
{
	int data[MAX_SIZE];
	int front;
	int rear;
}Queue;
//初始化
void InitQueue(Queue* q);
//判断队空
int isEmpty(Queue* q);
//判断队满
int isFull(Queue* q);
//元素入队
void PushQueue(Queue* q,int val);
//元素出队
int PopQueue(Queue* q);
//获取队头元素
int getFront(Queue* q);
//获取队尾元素
int getrear(Queue* q);

2.Queue.c源文件函数实现代码

#include"Queue.h"
//初始化
void InitQueue(Queue* q)
{
	q->front = 0;
	q->rear = 0;
}
//判断队空
int isEmpty(Queue* q)
{
	return q->front == q->rear;
}
//判断队满
int isFull(Queue* q)
{
	return (q->rear + 1) % MAX_SIZE == q->front;//(4+1)%5  MAX_SIZE == 5
}
//元素入队
void PushQueue(Queue* q, int val)
{
	if (isFull(q))
	{
		printf("队满了,无法入队\n");
		return;
	}
	q->rear = (q->rear + 1) % MAX_SIZE;//指向第n个
	q->data[q->rear] = val;//然后将val安插在数组的第n个位置上
}
//元素出队
int PopQueue(Queue* q)
{
	if (isEmpty(q))
	{
		printf("队空,无内容可以出队\n");
		return -1;
	}
	q->front = (q->front + 1) % MAX_SIZE;//指向第n个
	int temp = q->data[q->front];//保存指向第n个的数值放在temp中
	return temp;//返回这个第n个数值的值
}
//获取队头元素
int getFront(Queue* q)
{
	if (isEmpty(q))
	{
		printf("队空,无内容可以出队\n");
		return -1;
	}
	int temp = q->front + 1;
	return q->data[q->front];
}
//获取队尾元素
int getrear(Queue* q)
{
	if (isEmpty(q))
	{
		printf("队空,无内容可以出队\n");
		return -1;
	}
	return q->data[q->rear];
}

3.test.c测试代码

#include"Queue.h"
void test()
{
	Queue q;
	//初始化
	InitQueue(&q);
	//依次入队五个元素
	PushQueue(&q, 1);
	PushQueue(&q, 2);
	PushQueue(&q, 3);
	PushQueue(&q, 4);
	//出队元素两个 1 2
	printf("%d\n", PopQueue(&q));//1
	printf("%d\n", PopQueue(&q));//2
	printf("--------\n");
	//再插入两个元素
	PushQueue(&q, 5);
	PushQueue(&q, 6);
	//全输出 3 4 5 6
	printf("%d\n", PopQueue(&q));
	printf("%d\n", PopQueue(&q));
	printf("%d\n", PopQueue(&q));
	printf("%d\n", PopQueue(&q));

}
int main()
{
	test();
}

下面这些代码是数据结构书本C++代码的顺序表示,我将他们转换成C语言模式

 1.Queue.h头文件代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define SIZE_MAX 6
typedef int Queueint;
typedef struct
{
	Queueint* base;
	int front;
	int rear;
}Queue;
//初始化
void QueueInit(Queue* ps);
//求队长
int Queuelength(Queue* ps);
//入队
void QueuePush(Queue* ps, Queueint x);
//出队
int QueuePop(Queue* ps);

2.Queue.c函数代码实现

#include"Queue.h"
//初始化
void QueueInit(Queue* ps)
{
	ps->base = (Queueint*)malloc(sizeof(SIZE_MAX));
	if (ps->base == NULL)
	{
		perror("error");
		exit(1);
	}
	ps->front = ps->rear = 0;
}
//求队长
int Queuelength(Queue* ps)
{
	return (ps->rear - ps->front + SIZE_MAX) % SIZE_MAX;
}
//入队
void QueuePush(Queue* ps, Queueint x)
{
	if ((ps->rear+1)%SIZE_MAX == ps->front)
	{
		printf("队满了,无法进入\n");
		exit(1);
	}
	ps->rear = (ps->rear + 1) % SIZE_MAX;
	ps->base[ps->rear] = x;
}
//出队
int QueuePop(Queue* ps)
{
	if (ps->front == ps->rear)
	{
		printf("队空,无出队内容\n");
	}
	ps->front = (ps->front+1) % SIZE_MAX;
	int temp = ps->base[ps->front];
	return temp;
}

3.test.c测试代码

#include"Queue.h"
int main()
{
	Queue ps;
	QueueInit(&ps);
	QueuePush(&ps, 1);
	QueuePush(&ps, 2);
	QueuePush(&ps, 3);
	printf("%d", QueuePop(&ps));
	printf("%d", QueuePop(&ps));
	printf("%d", QueuePop(&ps));
}