划重点:
0.本文队列储存结构为int数组,长度为10,下标0-9.
1.如何成为循环队列:
元素入队,rear+1;元素出队,front+1;当rear=9,front>0时,数组的后方没有空间,但数组的前方还有空间,此时元素再入队,执行rear=(rear+1)%MAXqueue,rear=0,使用了数组前方的空间。
2.本文判断队空队满方法:
少用一个数据元素空间,即entry[front]不用,当队尾rear只差一步队头 (即 (rear+1)%MAXqueue==front)时认为队满。当front==rear时认为队空。
定义队列
#include<iostream>
#define MAXqueue 10 //后续会用到
#include<cstdlib>
using namespace std;
typedef enum Status { //后续会用到
success, fail, fatal, range_error,overflow,underflow
}Status;
typedef struct queue{ //定义队列
int front,rear; //指示队头和队尾位置
int entry[MAXqueue]; //数据元素储存空间
}Queue,*QueuePtr; //定义为新的数据类型
初始化队列
Status Queue_Init(QueuePtr *q){ //q是二重指针,*q指向队列
Status outcome = fatal;
QueuePtr queueptr = (QueuePtr)malloc(sizeof(Queue));
if(queueptr){
queueptr->front=-1;
queueptr->rear=-1;
*q = queueptr;
outcome = success;
}
return outcome;
}
销毁队列
void Queue_Destory(QueuePtr *q){
if(*q){ //*q存在即队列存在
free(*q);
*q = NULL;
}
}
清空队列
void Queue_Clear(QueuePtr q){
q->front = q->rear = -1;
}
//数据元素存储空间长度为10,下标为0-9,置为-1即回到初始化状态,不需要清空数据存储空间entry[MAXqueue]
队列判空
bool Queue_Empty(QueuePtr q){
return q->front==q->rear;
}
队列判满
bool Queue_Full(QueuePtr q){
return ((q->rear+1)%MAXqueue==q->front);
}
入队
Status Queue_EnQueue(QueuePtr q,int item){
Status outcome = overflow;
if(!Queue_Full(q)){
q->rear = (q->rear+1)%MAXqueue; //rear后移一位
q->entry[q->rear]=item;
outcome = success;
}
return outcome;
}
出队
Status Queue_DeQueue(QueuePtr q,int *item){
Status outcome = underflow;
if(!Queue_Empty(q)){
q->front = (q->front+1)%MAXqueue; //front后移一位
*item = q->entry[q->front]; //将出队元素放入item中
outcome = success;
}
return outcome;
}
求元素个数
int Queue_Size(QueuePtr q){
return (q->rear-q->front)%MAXqueue;
}