0
点赞
收藏
分享

微信扫一扫

数据结构与算法之队列


数据结构与算法之队列

  • ​​前提条件​​
  • ​​简介​​
  • ​​队列结构体​​
  • ​​队列基本运算​​
  • ​​初始化队列​​
  • ​​判断是否为空队列​​
  • ​​入队​​
  • ​​出队​​
  • ​​完整代码​​
  • ​​输出结果​​

前提条件

  • 熟悉C语言与指针
  • 熟悉数据结构与算法

简介

队列是一种先进先出(FIFO)的线性表,特殊之处在于它只允许在表的前端(Front)进行删除操作,而在表的后端(Rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头

队列结构体

typedef struct 
{
int *base; /*循环队列的存储空间首地址*/
int front,rear;/*队头、队尾指针*/
}SqQueue;

队列基本运算

初始化队列

int initQueue(SqQueue *Q)
/*创建容量为MAXQSIZE的空队列*/
{
Q->base=(int *)malloc(MAXQSIZE*sizeof(int));
if(!Q->base)
return -1; //创建失败,返回-1
Q->front=0;
Q->rear=0;
return 0;
}

判断是否为空队列

int isEmpty(SqQueue *Q)
/*判断队列是否为空*/
{
/*若队列为空,返回1,否则返回0*/
return Q->front==Q->rear;
}

入队

int enQueue(SqQueue *Q,int e)
/*元素e入队*/
{/*牺牲一个元素空间,约定以"队列的尾指针所指位置的下一个位置是头指针"表示队列满*/
if((Q->rear+1)%MAXQSIZE==Q->rear)
return -1;//队列满,返回-1
Q->base[Q->rear]=e; //在当前队尾插入元素e
Q->rear=(Q->rear+1)%MAXQSIZE; //队尾指针指向下一个位置
return 0;
}

出队

int deQueue(SqQueue *Q,int *e)
/*若队列不为空,则删除队头元素,由参数e带回其值并返回0;否则返回-1*/
{
if(Q->front==Q->rear)
return -1;//空队列,返回-1
*e=Q->base[Q->front];//获取删除队头元素的值
Q->front = (Q->front+1)%MAXQSIZE;//队头指针指向下一个位置
return 0;
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#define MAXQSIZE 100

typedef struct
{
int *base; /*循环队列的存储空间首地址*/
int front,rear;/*队头、队尾指针*/
}SqQueue;

int initQueue(SqQueue *Q)
/*创建容量为MAXQSIZE的空队列*/
{
Q->base=(int *)malloc(MAXQSIZE*sizeof(int));
if(!Q->base)
return -1; //创建失败,返回-1
Q->front=0;
Q->rear=0;
return 0;
}

int isEmpty(SqQueue *Q)
/*判断队列是否为空*/
{
/*若队列为空,返回1,否则返回0*/
return Q->front==Q->rear;
}

int enQueue(SqQueue *Q,int e)
/*元素e入队*/
{/*牺牲一个元素空间,约定以"队列的尾指针所指位置的下一个位置是头指针"表示队列满*/
if((Q->rear+1)%MAXQSIZE==Q->rear)
return -1;//队列满,返回-1
Q->base[Q->rear]=e; //在当前队尾插入元素e
Q->rear=(Q->rear+1)%MAXQSIZE; //队尾指针指向下一个位置
return 0;
}

int deQueue(SqQueue *Q,int *e)
/*若队列不为空,则删除队头元素,由参数e带回其值并返回0;否则返回-1*/
{
if(Q->front==Q->rear)
return -1;//空队列,返回-1
*e=Q->base[Q->front];//获取删除队头元素的值
Q->front = (Q->front+1)%MAXQSIZE;//队头指针指向下一个位置
return 0;
}

int main()
{
SqQueue Q;
int isSuceed,Emp,*e;
isSuceed = initQueue(&Q); /*创建容量为MAXQSIZE的空队列*/
printf("isSuceed(Success:0/Fail:-1):%d\n",isSuceed); //创建失败,返回-1,否则返回0
Emp = isEmpty(&Q);//*判断队列是否为空*/
printf("isEmpty(Nonempty:0/Empty:1):%d\n",Emp);//*若队列为空,返回1,否则返回0*/
enQueue(&Q,3);//元素3入队
enQueue(&Q,4);//元素4入队
enQueue(&Q,5);//元素5入队
printf("FrontElement:%d\n",Q.base[Q.front]);//队头元素
printf("RearElement:%d\n",Q.base[Q.rear-1]);//队尾元素
deQueue(&Q,e);//队头元素出队
printf("DeQueueElement:%d\n",*e);//出队的元素值
printf("FrontElement:%d\n",Q.base[Q.front]);//队头元素
printf("RearElement:%d\n",Q.base[Q.rear-1]);//队尾元素
system("pause");
return 0;
}

输出结果

数据结构与算法之队列_队列


举报

相关推荐

0 条评论