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

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

单链表的基本操作

队列的原理: 先进先出

代码实现

#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个元素的测试图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值