一、队列的概念
操作受限的线性表,允许在队列的一端执行入队操作,另一端执行出队操作
先进先出(FIFO)
1.顺序队列
物理结构连续,依赖于数组实现
队列中有一个队头指针和队尾指针,队头指针保存每次要出队的元素,队尾指针保存每次要入队的位置
顺序队列存在假溢满现象:队列中仍然有位置入队元素,但是队尾指针已经走到了队满的条件
2.循环队列
循环队列用于解决假溢满现象
如果循环队列的每个位置都存入元素,队列的判空和判满是同一种条件:front==rear;
所以循环队列会人为的浪费掉一个空间,用作判满条件
二、功能
循环队列结构体
#ifndef __SEQ_QUEUE_H__
#define __SEQ_QUEUE_H__
#define MAX 8
#include <stdio.h>
#include <stdlib.h>typedef int datatype;
typedef struct seq_que{datatype data[MAX];int front;int rear;
}queue,*queue_p;//创建
queue_p creat_que();
//判空
int que_empty(queue_p S);
//判满
int que_full(queue_p S);
//入队
void push_queue(queue_p S,datatype data);
//出队
void pop_queue(queue_p S);
//打印
void out_put(queue_p S);
//销毁
void free_que(queue_p *S);#endif
1.创建
//创建
queue_p creat_que(){queue_p S=(queue_p)malloc(sizeof(queue));if(S==NULL){printf("入参为空\n");return NULL;}S->front=0;S->front=S->rear;return S;
}
2.判空
//判空
int que_empty(queue_p S){if(S==NULL){printf("入参为空\n");return -1;}
return S->front==S->rear?1:0;}
3.判满
int que_full(queue_p S){if(S==NULL){printf("入参为空\n");return -1;}return (S->rear+1)%MAX==S->front?1:0;
}
4.入队
//入队
void push_queue(queue_p S,datatype data){if(S==NULL){printf("入参为空\n");return;}if(que_full(S)){printf("队列已满\n");return;
}
S->data[S->rear]=data;
S->rear=(S->rear+1)%MAX;
}
5.出队
//出队
void pop_queue(queue_p S){if(S==NULL){printf("入参为空\n");return;}if(que_empty(S)){printf("队列为空\n");return;}
S->front=(S->front+1)%MAX;
}
6.打印
//打印
void out_put(queue_p S){if(S==NULL){printf("入参为空\n");return;}//符合队列的性质,从头开始打印//先保留一份队头元素的下标int temp=S->front;while(temp!=S->rear){printf("%d ",S->data[temp]);temp=(temp+1)%MAX;}putchar(10);
}
7.销毁
//销毁
void free_que(queue_p *S){if(S==NULL || *S==NULL){printf("入参为空\n");return; }free(*S);*S=NULL;
}