队列
队列:先进先出的线性表
顺序队列
队列有队头的front指针和队尾的rear指针。顺序队列的出队是通过移动first指针进行操作的“假删除”。
普通顺序队列
//顺序普通队列板子
#define MAX 10
typedef struct{
int data[MAX];
int front;
int rear;
}queque;
void init(queque* a){//初始化队列
a->front=a->rear=-1;
}
int add(queque* a,int num){//新元素入队
if(a->rear==MAX-1) return 1;
else{
a->rear++;
a->data[a->rear]=num;
return 0;
}
}
int delete(queque* a){//元素出队,注意顺序队列中只是通过移动队头指针实现的“假删除”
if(a->front==a->rear) return 1;
else{
a->front++;
return 0;
}
}
int gethead(queque* a){
if(a->front==a->rear) return 1;
else return a->data[a->front];
}
int getlast(queque* a){
if(a->front==a->rear) return 1;
else return a->data[a->rear];
}
int length(queque* a){
return a->rear-a->front;
}
int checkempty(queque* a){
if(a->front==a->rear) return 0;
else return 1;
}
int checkfull(queque* a){//注意会出现假上溢情况
if(a->rear==MAX-1) return 0;
else return 1;
}
循环顺序队列
为避免出现假上溢情况,一般采取循环顺序队列。尾指针通过取模运算自动控制其所在下标。(实现:[(rear+1)%maxsize])
浪费数组内一个空间的情况
#define MAX 10
typedef struct{
int data[MAX];
int front,rear;
}queue;
void inti(queue* a){
a->front=a->rear=MAX-1;//模拟普通顺序队列的front指向队头元素的前一个元素 从而完成浪费一个数组空间的操作
}
int add(queue* a,int num){
if((a->rear+1)%MAX==a->front) return 1;
else{
a->rear=(a->rear+1)%MAX;//浪费一个空间的方式
a->data[a->rear]=num;
return 0;
}
}
int delete(queue* a){
if(a->front==a->rear) return 1;
else{
a->front=(a->front+1)%MAX;
return 0;
}
}
int length(queue* a){
return (a->rear-a->front+MAX)%MAX;//此处取模的方式非常巧妙。注意front为指向队头的前一个元素
}
int gethead(queue* a){
if(a->rear==a->front) return 1;
else return a->data[(a->front+1)%MAX];
}
int getrear(queue* a){
if(a->rear==a->front) return 1;
else return a->data[(a->rear+1)%MAX];
}
int checkempty(queue* a){
if(a->rear==a->front) return 0;
else return 1;
}
int checkfull(queue* a){
if((a->rear+1)%MAX==a->front) return 0;
else return 1;
}
一般都是采取浪费一个空间的情况,如不想浪费数组内一个空间,需要先将元素入队,再加判断的情况下移动指针。
扩展:双端队列
允许在队列两端(前端和后端)进行入队和出队操作。后端进前端出/前端进后端出——队列,前端进前端出/后端进后端出——栈。文章来源:https://www.toymoban.com/news/detail-802977.html
链式队列
本质:带头指针和尾指针的单链表,尾插法入队,删除首元结点出队。在内存条允许范围内不会出现假上溢的情况。文章来源地址https://www.toymoban.com/news/detail-802977.html
C++ STL库 <queque>
到了这里,关于队列板子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!