队列 : 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。
队列具有先进先出 。
入队列:进行插入操作的一端称为队尾。( push)
出队列:进行删除操作的一端称为队头。 (pop)
如图所示:
创建队列结构体:
typedef struct Queue{
int data[MAX]; //顺序存储 数组模拟的队列
int size; //队列的大小(队列中元素个数)
}Queue , *SeQueue;
队列的初始化(数组头做对头,数组尾做队尾):
SeQueue init(){
//申请队列空间,即数组空间
SeQueue p = (Queue *)malloc(sizeof(Queue));
//判断队列空间是否申请成功
if(p == NULL){
return NULL;
}
//初始化 队列大小,当前这个队列并没有元素需要赋0值
p->zieof = 0;
int i;
//当前队列里面没有元素,需要赋0值等待入队
for(i = 0; i < MAX; i++){
p->data[i] = 0;
}
//返回一个队列指针
return p;
}
队列的入队:
void push(SeQueue p , int value){
if(p == NULL){ //队列不存在
return;
}
//当队列的元素哥数等等于这个数组的最大容量就说明队列满了
if(p->size == MAX){
printf("队列元素已满!\n");
return;
}
//进队
p->data[p->size] = value;
//改变队列元素个数
p->size ++;
}
队列出队:
void push(SeQueue p){
if(p == NULL){ //队列不存在
return;
}
//当队列的元素个数等等于0队列满了
if(p->size == 0){
printf("队列元素已空!\n");
return;
}
//出队 删除数组首元素
int i;
//让后一个元素直接覆盖当前元素
for(i = 0; i < p->size-1 ; i++){
p->data[i] = p->data[i+1];
}
//改变队列元素个数
p->size --;
}