利用静态数组模拟队列的创建
一.队列的定义
队列简称队,它也是一种运算受限的线性表。队列只能选取一个端点进行插入操作,另一个端点进行删除操作。
二.队列的几个概念
1.把进行插入的一端称做队尾。
2.进行删除的一端称做队首或队头。
3.向队列中插入新元素称为进队或入队,新元素进队后就成
为新的队尾元素。
4.从队列中删除元素称为出队或离队,元素出队后,其后继元素就成为队首元素。
队列的主要特点是先进先出,所以又把队列称为先进先出表。
三.队列的基本运算(函数)如下:
SqQueue *InitSqueue(SqQueue *squeue) //初始化队列,为队列分配内存
bool enterQueue(SqQueue *squeue, int input); //元素进入队列
bool outQueue(SqQueue *squeue, int *out_value); //元素走出队列
bool printSqQ(SqQueue *squeue); //打印(输出)队列中的元素
bool clearSqQ(SqQueue *squeue); //清空队列的元素
bool isEmpty(SqQueue *squeue); //判断队列是否为空队列
void Destory(SqQueue *squeue); //销毁队列——回收系统分配的内存
既然队列中元素逻辑关系与线性表的相同,队列可以采用与线性表相同的存储结构。
四.理清队列运行机制
在实现队列的顺序存储结构及其函数之前,先看看队列是如何进行的,见下图。
总结:
1.约定rear总是指向队尾元素
2.元素进队,rear增1
3.约定front指向当前队中队头元素的前一位置
4.元素出队,front增1
5.当rear=MaxSize-1时不能再进队
队列的四个要素:
1.队空条件:front = rear
2.队满条件:rear = MaxSize-1
3.元素e进队:rear++; data[rear]=e;
4.元素e出队:front++; e=data[front
五.队列的顺序存储结构及其函数的实现
1.头文件和预定义:
#include
#include
#define max_size 10 //队列最长长度为10
2.顺序队类型SqQueue定义如下:
typedef struct Sqqueue{ //声明一个队列结构体
int sqQueue[max_size]; //顺序队列数组
int front; //指向队列的头
int rear; //指向队列的尾
}SqQueue;
3.初始化队列
SqQueue *InitSqueue(SqQueue *squeue) //初始化队列,为队列分配内存
{
squeue = (SqQueue *)malloc(sizeof(SqQueue));
squeue->front = -1;
squeue->rear = -1;
printf("初始化队列完成.....\n");
return squeue;
}
4.元素进入队列
bool enterQueue(SqQueue *squeue, int input) //元素进入队列
{
(squeue->rear)++;
if((squeue->rear) != max_size )
squeue->sqQueue[squeue->rear] = input;
return true;
}
5.元素出队列
bool outQueue(SqQueue *squeue, int *out_value) //元素走出队列
{
if((squeue->front) != (squeue->rear)){
(squeue->front)++;
*out_value = (squeue->SqQueue[squeue->front]);
return true;
}
return false;
}
6.打印队列元素
bool printSqQ(SqQueue *squeue) //打印(输出)队列中的元素
{
while((squeue->front) != (squeue->rear)){
(squeue->front)++;
printf("%d ", squeue->SqQueue[squeue->front]);
}
printf("\n");
if((squeue->front) == (squeue->rear))
return true;
else
return false;
}
7.清空队列中的元素
bool clearSqQ(SqQueue *squeue) //清空队列的元素
{
while((squeue->front) != (squeue->rear)){
(squeue->front)++;
}
if((squeue->front) == (squeue->rear))
return true;
else
return false;
}
8.判断队列是否为空队列
bool isEmpty(SqQueue *squeue) //判断队列是否为空队列
{
return (squeue->front == squeue->rear);
}
9.销毁队列
void Destory(SqQueue *squeue) //销毁队列——回收系统分配的内存
{
free(squeue);
squeue = NULL;
printf("内存回收完成......\n");
}
六.最后附上自己队列源代码:
/*
*用静态数组模拟队列
*/
#include
#include
#define max_size 10 //队列最长长度为10
typedef struct Sqqueue{ //声明一个队列结构体
int sqQueue[max_size]; //顺序队列
int front; //指向队列的头
int rear; //指向队列的尾
}SqQueue;
bool flag = false; //声明一个boolean类型的flag用于存储函数返回值
SqQueue *squeue = NULL; //声明队列,并初始化为空
SqQueue *InitSqueue(SqQueue *squeue); //初始化队列,为队列分配内存
bool enterQueue(SqQueue *squeue, int input); //元素进入队列
bool outQueue(SqQueue *squeue, int *out_value); //元素走出队列
bool printSqQ(SqQueue *squeue); //打印(输出)队列中的元素
bool clearSqQ(SqQueue *squeue); //清空队列的元素
bool isEmpty(SqQueue *squeue); //判断队列是否为空队列
void Destory(SqQueue *squeue); //销毁队列——回收系统分配的内存
int main(void){
int input = 0;
int *output = (int *)malloc(sizeof(int));
printf("正在初始化队列中.....\n");
squeue = InitSqueue(squeue);
printf("请输入要进入队列的数(0表示结束!):\n");
while(scanf("%d",&input)&&input != 0){
if(input == 0){
break;
}
flag = enterQueue(squeue, input);
if(flag == true)
printf("%d进入队列成功!\n", input);
else
printf("%d进入队列失败!\n", input);
}
printf("输入结束.....\n");
flag = printSqQ(squeue);
if(flag == true)
printf("´打印队列成功.........\n");
flag = outQueue(squeue, output);
if(flag == true)
printf("队首%d已经走出队列!\n", *output);
printf("开始清空队列元素.......\n");
flag = clearSqQ(squeue);
if(flag == true)
printf("清空完毕!\n");
flag = isEmpty(squeue);
if(flag == true)
printf("当前队列为空队列!\n");
printf("正在回收队列的内存....\n");
Destory(squeue);
return 0;
}
SqQueue *InitSqueue(SqQueue *squeue) //初始化队列,为队列分配内存
{
squeue = (SqQueue *)malloc(sizeof(SqQueue));
squeue->front = -1;
squeue->rear = -1;
printf("初始化队列完成.....\n");
return squeue;
}
bool enterQueue(SqQueue *squeue, int input) //元素进入队列
{
(squeue->rear)++;
if((squeue->rear) != max_size ){
squeue->sqQueue[squeue->rear] = input;
return true;
}
return false;
}
bool outQueue(SqQueue *squeue, int *out_value) //元素走出队列
{
if((squeue->front) != (squeue->rear)){
(squeue->front)++;
*out_value = (squeue->sqQueue[squeue->front]);
return true;
}
return false;
}
bool printSqQ(SqQueue *squeue) //打印(输出)队列中的元素
{
while((squeue->front) != (squeue->rear)){
(squeue->front)++;
printf("%d ", squeue->sqQueue[squeue->front]);
}
printf("\n");
if((squeue->front) == (squeue->rear))
return true;
else
return false;
}
bool clearSqQ(SqQueue *squeue) //清空队列的元素
{
while((squeue->front) != (squeue->rear)){
(squeue->front)++;
}
if((squeue->front) == (squeue->rear))
return true;
else
return false;
}
bool isEmpty(SqQueue *squeue) //判断队列是否为空队列
{
if(squeue->front == squeue->rear)
return true;
else
return false;
}
void Destory(SqQueue *squeue) //销毁队列——回收系统分配的内存
{
free(squeue);
squeue = NULL;
printf("内存回收完成......\n");
}