顺序队列及其操作
一、顺序队列基本概念
队列是一种特殊的线性表,它的特殊性在于队列的插入和删除操作分别在表的两端进行。插入的那端称为队尾,删除的那段称为队首,队列的插入和删除操作简称进队和出队。
顺序队列的基本存储结构:
#define Maxsize 100
typedef int datatype;
typedef struct{
datatype a[Maxsize];
int front;
int rear;
}sequence_queue;
二、顺序队列的操作集合
//void init(sequence_queue *sq) //int empty(sequence_queue sq) //datatype get(sequence_queue sq) //void insert(sequence_queue *sq,datatype x) //void dele(sequence_queue *sq) //void print(sequence_queue sq)
三、顺序队列的代码实现
初始化顺序队列
/*****************************/
/* 函数名:init */
/* 函数功能:初始化队列 */
/* 函数参数:sq顺序队列指针 */
/* 函数返回值:null */
/****************************/
void init(sequence_queue *sq)
{
sq->front=sq->rear=0;
}
判断顺序队列是否为空
/*******************************/
/* 函数名:empty */
/* 函数功能:判断队列是否为空 */
/* 函数参数:sq顺序队列 */
/* 函数返回值:int。1空 0非空 */
/*******************************/
int empty(sequence_queue sq)
{
return(sq.front==sq.rear?1:0);
}
获取顺序队列队首值
/*****************************/
/* 函数名:get */
/* 函数功能:获取队列队首值 */
/* 函数参数:sq顺序队列 */
/* 函数返回值:datatype。 */
/*****************************/
datatype get(sequence_queue sq)
{
if(empty(sq)){
printf("顺序队列为空,无法获取队首值!\n");
exit(1);
}
return sq.a[sq.front];
}
插入(入队)操作
/*******************************/
/* 函数名:insert */
/* 函数功能:插入(入队)操作 */
/* 函数参数:sq顺序队列指针 */
/* x插入值 */
/* 函数返回值:null */
/*******************************/
void insert(sequence_queue *sq,datatype x)
{if(sq->rear==Maxsize){
printf("队列已满,无法插入!\n");
exit(1);
}
sq->a[sq->rear]=x;
sq->rear++;
}
删除(出队)操作
/*******************************/
/* 函数名:dele */
/* 函数功能:删除(出队)操作 */
/* 函数参数:sq顺序队列指针 */
/* 函数返回值:null */
/*******************************/
void dele(sequence_queue *sq)
{if(sq->front==sq->rear){
printf("队列为空,无法删除!\n");
exit(1);
}
sq->front++;
}
打印顺序队列
/**************************/ /* 函数名:print */ /* 函数功能:打印队列 */ /* 函数参数:sq顺序队列 */ /* 函数返回值:null */ /**************************/ void print(sequence_queue sq) { int i; if(empty(sq)) printf("队列为空,无法打印!\n"); else{ for(i=sq.front;i<sq.rear;i++) printf("%d ",sq.a[i]); printf("\n"); } }
四、循环队列
为了有效利用空间,将顺序存储队列看作一个圆环,队尾和队首是相连的。
即:(rear+1)%Maxsize = front
循环队列的插入(入队)
/*******************************/
/* 函数名:insert_c */
/* 函数功能:插入(入队)操作 */
/* 函数参数:sq顺序队列指针 */
/* x插入值 */
/* 函数返回值:null */
/******************************/
void insert_c(sequence_queue *sq,datatype x)
{
if((sq->rear+1)%Maxsize==sq->front){
printf("队列已满,无法插入!\n");
exit(1);
}
sq->a[sq->rear]=x;
sq->rear=(sq->rear+1)%Maxsize;
}
循环队列删除(出队)
/*****************************/
/* 函数名:dele_c */
/* 函数功能:删除(出队)操作 */
/* 函数参数:sq顺序队列指针 */
/* 函数返回值:null */
/****************************/
void dele_c(sequence_queue *sq)
{
if(sq->front==sq->rear){
printf("队列为空,无法删除!\n");
exit(1);
}
sq->front=(sq->front+1)%Maxsize;
}
φ(゜▽゜*)♪ 感谢观看,希望对你有帮助!