数据结构与算法之队列
- 前提条件
- 简介
- 队列结构体
- 队列基本运算
- 初始化队列
- 判断是否为空队列
- 入队
- 出队
- 完整代码
- 输出结果
前提条件
- 熟悉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;
}
输出结果