队列:先进后出 后进先出
只允许从 一段添加元素 从另一端删除元素
队头 出元素 队尾 进元素
push pop
数组的首地址 做好 队头好,还是队尾好?
答:都一样,做队头和队尾差别不大,因为 都需要移动大量元素
队列的结构体
typedef sturct Queue{
int data[MAX]; //循序存储 数组模拟的队列
int size; //队列的大小(队列中元素个数)
}Queue,*SeqQueue;
队列的初始化
SeqQueue init(){
//申请队列空间,即数组空间
SeqQueue p=(Queue *)malloc(sizeof(Queue));
if(p==NULL){
return NULL;
}
//初始化 队列大小
p->size=0;
for(int i=0;i<MAX;i++){
p->data[i]=0;
}
return p;
}
入队
void push(SeqQueue p,int vaule){
if(p==NULL){ //队列不在
return;
}
if(p->size==MAX){
printf("队列元素已满!\n");
return;
}
//进队
p->data[p->size]=value;
//改变队列元素个数
p->size++;
}
出队
void push(SeqQueue p){
if(p==NULL){ //队列不存在
return;
}
if(p->size==0){
printf("队列元素已空!\n");
return;
}
//出队 删除数组首元素
for(int i=0;i<p->size-1;i++){
p->data[i]=p->data[i+1];
}
//改变队列元素个数
p->size--;
}
要记得,看到循环里面有i+1的时候,要改变 最终值
队列的链式存储:
链表的 头结点端 做队头 还是队尾?
答:作队好,因为 头结点端进行删除方便尾端 插入元素方便(尾插法)
循环队列:
//队满
front=(rear+1)%n //front头,rear尾
//队空
front=rear; //头指针 指向 尾指针 为空