线性结构的常见应用:队列(两端操作)
定义:一种可以实现“先进先出”的存储结构
分类:链式队列,静态队列:用数组实现,通常都必须是循环队列
①静态队列为什么必须是循环队列?
如果不使用循环队列,那么删除的元素所占用的空间将无法再次使用
②循环队列需要几个参数来确定
两个:front,rear。
③循环队列各个参数的含义
两个参数在不同场合有不同的含义
1)队列初始化:front和rear的值都是零
2)队列非空:front代表的是队列的第一个元素,rear代表的是队列的最后一个有效元素的下一个元素
3)队列空:front和rear的值相等,但不一定是零
④循环队列入队的伪算法
1)将值存入rear代表的位置
2)rear=(rear+1)%数组的长度
⑤循环队列出队的伪算法
front=(front+1)%数组的长度
⑥如何判断循环队列是否为空
front==rear时队列一定为空
⑦如何判断循环队列是否已满
方式(1)增加一个标识参数
方式(2)少用一个空间存储元素 (常用√)
(rear+1)%数组长度==front 时为满
队列的具体应用:
所有和时间有关的操作都有队列的影子
VS2017中,c语言实现队列的初始化,入队,出队,遍历算法
#include<stdio.h>
#include<stdlib.h>
typedef struct queue {
int * pBase;
int front;
int rear;
}QUEUE;
void init(QUEUE *);
bool en_queue(QUEUE *, int);
void traverse_queue(QUEUE *);
bool full_queue(QUEUE *);
bool empty_queue(QUEUE *);
bool out_queue(QUEUE *, int *);
int main() {
QUEUE Q;
int val;
init(&Q);
en_queue(&Q, 1);
en_queue(&Q, 2);
en_queue(&Q, 3);
en_queue(&Q, 4);
en_queue(&Q, 5);
en_queue(&Q, 6);
traverse_queue(&Q);
if (out_queue(&Q, &val))
printf("出队成功,出队的元素是:%d\n", val);
else
printf("出队失败\n");
system("pause");
return 0;
}
void init(QUEUE *p) {
p->pBase = (int *)malloc(sizeof(int) * 6);//指向一个数组 这个数组有6个元素
p->front = 0;
p->rear = 0;
}
bool full_queue(QUEUE *p) {
if ((p->rear + 1) % 6 == p->front)
return true;
else
return false;
}
bool en_queue(QUEUE *p, int val) {
if (full_queue(p))
return false;
else {
p->pBase[p->rear] = val;
p->rear = (p->rear + 1) % 6;
return true;
}
}
//需要用i来代替front 不然会改变front的值
void traverse_queue(QUEUE *p) {
int i = p->front;
while (i != p->rear) {
printf("%d ", p->pBase[i]);
i = (i + 1) % 6;
}
printf("\n");
}
bool empty_queue(QUEUE *p) {
if (p->front == p->rear)
return true;
else
return false;
}
bool out_queue(QUEUE *p, int *pVal) {
if (empty_queue(p))
return false;
else {
* pVal = p->pBase[p->front];
p->front = (p->front + 1) % 6;
return true;
}
}