数据结构和算法—队列

队列的原理

队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out)

队列的要点

 队列是一种受限的线性结构
 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
(也可以在表的后端进行插入, 表的前端进行删除), 万变不离其宗, 先进先出

现实生活的例子

如:到餐厅打饭,都是高素质的人,所以不存在插队的情况, 先来的先打到饭,就先出去…
排队…排在前面的先出去…

记住队列的原理就行, 先进先出, 怎么改变都是按照这个原理来的

代码实现

#include <iostream>
#include <Windows.h>
#include <stdio.h>

#define MAX_ELEM 10

// 队列的定义
typedef int ELEM;

typedef struct {
	ELEM* date;	// 动态
	// ELEM date[MAX_ELEM];	// 静态
	int front;	// 头, 进行删除
	int rear;	// 尾, 进行插入	
}Queue;

// 初始化队列
bool initQueue(Queue* q) {
	if(!q) return false;

	q->date = new ELEM[MAX_ELEM];
	if(!q->date) return false;

	q->front = q->rear = 0;
	return true;
}

// 队列是否为空
static bool empty(Queue* q) {
	if(!q) return false;

	if(q->front == q->rear) return true;

	return false;
}
// 队列是否为满
static bool full(Queue* q) {
	if(!q) return false;

	if(q->rear == MAX_ELEM) return true;

	return false;
}

// 入队  判断元素是否存满
bool EnQueue(Queue* q, ELEM& e) {
	if(!q || !q->date) return false;
	if(full(q)) return false;	//元素已经存满,不能继续存储
	
	q->date[q->rear] = e;
	q->rear++;
	return true;
}

// 出队  判断是否存在元素
bool DeQueue(Queue* q) {
	if(!q || !q->date) return false;
	if(empty(q)) return false;		// 没有元素
	
	//1. 前移实现出队
	for(int i = q->front+1; i < q->rear; i++) {
		q->date[i-1] = q->date[i];
	}
	
	q->rear--;

	//2. 把front往后移动,实现出队
	// q->front++;			// 这个方法,存在问题, “假溢出”,   解决方法,循环队列
	
	return true;
}

// 获取长度
int length(Queue* q) {
	if(!q || !q->date) return -1;

	return q->rear - q->front;
}

// 获取首元素
void getElem(Queue* q, ELEM& e) {
	if(!q || !q->date) return;
	if(empty(q)) return;

	e = q->date[q->front];
}

// 清空队列
void clear(Queue* q) {
	q->front = q->rear = 0;
}

// 销毁队列
void destroy(Queue* q) {
	if(q->date) delete[] q->date;

	q->front = q->rear = 0;
}

//遍历
void print(Queue* q) {
	if(!q || !q->date) return;

	for(int i = q->front; i < q->rear; i++) {
		printf("%d ", q->date[i]);
	}
	printf("\n");
}
int main(void) {
	Queue q;
	ELEM e;
	// 初始化队列
	initQueue(&q);

	for(int i=0; i<=11; i++) {
		// 入队
		e = i+1;
		if(EnQueue(&q, e)) {
			printf("入队成功\n");
		} else {
			printf("入队失败\n");
		}
	}
	print(&q);
	
	// 2   清空队列
	 // clear(&q);
	
	// 出队3个元素
	for(int i=0; i < 3; i++) {
		if(DeQueue(&q)) {
			printf("出队成功\n");
		} else {
			printf("出队失败\n");
		}
	}
	
	print(&q);
}

这个是没有打开 清空队列那条语句
在这里插入图片描述

这个是打开清空队列后的截屏

在这里插入图片描述

发布了18 篇原创文章 · 获赞 2 · 访问量 227

猜你喜欢

转载自blog.csdn.net/weixin_44238530/article/details/102645660