线性结构-队列

二 队列

一.什么是队列

在这里插入图片描述
队列:两端"开口", 尾进头出_先进先出( 以图片为准则 理解图片以及记忆原理方法而非概念 )

队头和队尾

队头: 队列中出队列的一端

队尾: 队列中进队列的一端

队列的实现方法
  1. 顺序表_顺序队列
  2. 链表_链式队列
队列的应用

排队问题…

二.顺序队列

#include<stdio.h>

// 入队
// 参数: 存储结构,队尾,数据
// 返回值: 队尾
int enQueue(int* a, int rear, int data) {
	// rear: 即将添加数据的位置
	a[rear] = data;
	printf("元素%d以入队\n", a[rear]);
	rear++;
	return rear;
}
// 出队
// 参数: 存储结构,队尾,队头
// 返回值: 队头指针
int deQueue(int* a, int rear, int front) {
	// 判断
	if (rear == front) {
		printf("删除失败,队列为空\n");
	}
	else {
		printf("元素%d已出队\n",a[front]);
		front++;
	}
	return front;
}

int main()
{
	// 数组(队列)
	int a[100];
	// 队头和队尾
	int rear, front;
	// 当队列中没有元素的时候.队头和队尾是同一个地方
	rear = front = 0;
	// 入队
	for (size_t i = 0; i < 5; i++)
	{
		rear = enQueue(a, rear, i);          // 队列中按顺序存入12345
	}
	// 出队
	while (rear != front) {
		front = deQueue(a, rear, front);
	}
	front = deQueue(a, rear, front);

} 

问题1: 头和尾不断递增, 而数组有限制

问题2: 如果不断存储,不出队列,数组需要扩容

个位可以想一想啊, 往后一起我写出我的解决方案, 但是想看看大佬们的操作

三.链式队列

#include<stdio.h>
#include<stdlib.h>

// 节点
typedef struct QNode {
	int data;
	struct QNode* next;
}QNode;

// 创建队列(头节点)
QNode* initQueue() {
	// 创建头节点
	QNode* queue = (QNode*)malloc(sizeof(QNode));
	// 赋值(头节点不存储数据,或初始化任意值)
	queue->next = NULL;
	return queue;
}

// 入队
QNode* enQueue(QNode* rear, int data)
{
	// 1 做一个新的节点
	QNode* NewNode = (QNode*)malloc(sizeof(QNode));
	NewNode->data = data;
	NewNode->next = NULL;

	// 2 使用尾插法添加
	rear->next = NewNode;
	rear = NewNode;

	return rear;
}

// 出队
QNode* deQueue(QNode* front, QNode* rear) {
	if (front->next == NULL)
	{
		printf("队列为空!\n");
		return rear;
	}
	// 创建临时指针
	QNode* pList = front->next;
	// 显示数据
	printf("%d  ",pList->data);
	// 断头, 换头
	front->next = pList->next;
	// 判断
	if (rear == pList)
	{
		rear = front;
	}
	// 释放
	free(pList);
	return rear;
}
int main() {
	QNode* queue, * front, * rear;
	queue = front = rear = initQueue();

	// 入队
	for (size_t i = 1; i <= 5; i++)
	{
		rear = enQueue(rear, i);
	}

	// 出队
	rear = deQueue(front, rear);
	rear = deQueue(front, rear);
	rear = deQueue(front, rear);
	rear = deQueue(front, rear);
	rear = deQueue(front, rear);
	rear = deQueue(front, rear);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值