数据结构和算法—链式队列

链式队列和链表相似, 不过加了限制, 只允许在头进行删除, 尾进行插入(亦或头进行插入, 尾进行删除)

单链表的基本操作

队列的原理: 先进先出

代码实现

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

#define MAX_SIZE 10

// 链式队列的定义
typedef int ELEM;
typedef struct _Node {
	ELEM date;
	struct _Node* next;
}Node;

typedef Node* QueuePrt;

typedef struct _Queue {
	int length;
	QueuePrt front;
	QueuePrt rear;
}Queue;

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

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

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

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

	return false;
}

// 队列是否为满, 理论来讲,它可以无限, 但一定要设置个上限,哪怕1000w,也是可以, 不能“无限”
bool full(Queue* q) {
	if(!q) return false;

	if(q->length == MAX_SIZE) return true;
	
	return false;
}

// 入队
bool EnQueue(Queue* q, Node& e) {
	if(!q) return false;
	if(full(q)) return false;
	
	Node* p = new Node;
	if(!p) return false;
	
	p->date = e.date;
	p->next = NULL;
	
	// 俩种情况 1.第一次入队  2.已入队
	if(q->front == NULL) {
		q->front = q->rear = p;	//1
	} else {
		q->rear->next = p;	//上一次rear指向的节点, 把它的next指向e
		q->rear = p;		//吧rear指向新节点
	}

	q->length++;
	return true;		
}

// 出队
bool DeQueue(Queue* q) {
	if(!q) return false;
	if(empty(q)) return false;	//不存在出队元素

	Node* p = q->front;
	q->front = p->next;
	//1. 出队后,还存在元素    2.出队后,不存在元素, rear置为NULL
	if(q->front == NULL) q->rear = NULL;
	
	q->length--;
	
	delete p;
	return true;
}

// 获取长队
int length(Queue* q) {
	if(!q) return -1;
	
	return q->length;
}

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

// 清空队列
void clear(Queue* q) {
	if(!q || !q->front) return;

	Node* p = q->front;
	while(p) {
		q->front = p->next;
		delete p;
		p = q->front;
	}

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

// 遍历
void print(Queue* q) {
	if(!q || !q->front) return;
	
	Node* p = q->front;
	while(p) {
		printf("%d ", p->date);
		p = p->next;
	}
	print("\n");
}
int main(void) {
	Queue q;
	Node e;
	// 初始化队列
	initQueue(&q);

	for(int i=0; i<=11; i++) {
		// 入队
		e.date = i+1;
		if(EnQueue(&q, e)) {
			printf("入队成功\n");
		} else {
			printf("入队失败\n");
		}
	}

	print(&q);

	// 清空队列
	// clear(&q); 

	// 出队三个元素
	for(int i=0; i<3; i++) {
		if(DeQueue(&q)) {
			printf("出队成功\n");
		} else {
			printf("出失败\n");
		}
	}

	print(&q);

	system("pause");
	return 0;
}

下图为入队12个元素, 出队3个元素的测试图

在这里插入图片描述

下图为入队12个元素,清空队列后, 出队3个元素的测试图
在这里插入图片描述

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

猜你喜欢

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