队列数据结构(顺序表示-数组)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));
}