郝斌数据结构学习记录(四)——队列的笔记及部分算法的c语言实现

可紊 提交于 2020-02-02 20:37:59
线性结构的常见应用:队列(两端操作)

定义:一种可以实现“先进先出”的存储结构
分类链式队列静态队列:用数组实现,通常都必须是循环队列

①静态队列为什么必须是循环队列?

如果不使用循环队列,那么删除的元素所占用的空间将无法再次使用

②循环队列需要几个参数来确定

两个: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;
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!