数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)

目录

一、顺序队列

1、存储结构

2、入队和出队 

 总代码

二、循环队列

总代码:

三、链队列

1、存储结构

2、入队和出队

总代码


一、顺序队列

队列特征:先进后出、后进后出

1、存储结构

//队列
typedef struct
{
	int data[MAXSIZE];			//存放元素
	int front;							//队首(出队)
	int rear;							//队尾(入队)
}SqQueue;
SqQueue Q;

2、入队和出队 

入队:从队尾放入元素,rear++

出队:从队首取出元素,front++

 总代码

//顺序队列
//主要用front和rear分别指向队首和队尾
//进栈时:rear指向处放入数据,rear++	
//出栈时,front指向处取出数据,front++
#include<stdio.h>

#define MAXSIZE 6

//队列
typedef struct
{
	int data[MAXSIZE];			//存放元素
	int front;							//队首(出队)
	int rear;							//队尾(入队)
}SqQueue;
SqQueue Q;

void Init_List()
{
	Q.front = 0;
	Q.rear = 0;
}

//入队
void EnQueue(int num)
{
	if (Q.rear >= MAXSIZE)			//判断队列满
	{
		printf("栈已满!\n");
		return;
	}
	Q.data[Q.rear++] = num;		//元素入队,rear++
}

//出队
int DeQueue()
{
	int s;
	if (Q.front == Q.rear)				//判断队列空
	{
		printf("栈空!\n");
		return -1;
	}
	return Q.data[Q.front++];		//元素出队,front++
}

int main()
{
	Init_List();			//初始化

	//入队
	EnQueue(0);
	EnQueue(1);
	EnQueue(2);
	EnQueue(3);
	EnQueue(4);
	EnQueue(5);

	//EnQueue(5);				//队列满测试

	//出队
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());

	return 0;
}

二、循环队列

存储结构和队列一样,把存储空间当成一个环,完成首位相接,完成循环,其核心是一个算法表达式:

//为什么要加1:如果不加1,那么和队列为空的条件相同(front==rear)
Q.rear = (Q.rear + 1) % MAXSIZE;			//起到循环的效果(循环队列入队)

Q.front = (Q.front + 1) % MAXSIZE;			//起到循环的效果(循环队列出队)

用上面的代码,把空间范围禁锢在MAXSIZE之内,不会超过其范围。rear和front也只会在里面移动。

总代码:

//循环队列
//用(front+1)%MAXSIZE完成在MAXSIZE内的循环
//(rear+1)%MAXSIZE同理
//为什么要加1:如果不加1,那么和队列为空的条件相同(front==rear)
#include<stdio.h>

#define MAXSIZE 6			//大小为6,但循环队列少存一个,实际只存5个元素

//队列
typedef struct
{
	int data[MAXSIZE];
	int front;
	int rear;
}SqQueue;
SqQueue Q;

void Init_List()
{
	Q.front = 0;
	Q.rear = 0;
}

//入队
void EnQueue(int num)
{
	if ((Q.rear + 1) % MAXSIZE == Q.front)		//判断队列满
	{
		printf("队列已满!\n");
		return;
	}
	Q.data[Q.rear] = num;
	Q.rear = (Q.rear + 1) % MAXSIZE;			//起到循环的效果(循环队列入队)
}

//出队
int DeQueue()
{
	int s;
	if (Q.front == Q.rear)								//判断队列空
	{
		printf("队列已空!\n");
		return -1;
	}
	s = Q.data[Q.front];
	Q.front = (Q.front + 1) % MAXSIZE;			//起到循环的效果(循环队列出队)
	return s;
}

int main()
{
	Init_List();						//初始化

	//入队
	EnQueue(0);
	EnQueue(1);
	EnQueue(2);
	EnQueue(3);
	EnQueue(4);
	//EnQueue(5);								//队满测试


	//出队
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	//printf("%d\n", DeQueue());		//队空测试

	return 0;
}

三、链队列

1、存储结构

*rear*front由原来的int变成了指针,分别指向队尾和队首元素的地址。

前后元素通过*next相连接。

//链队列
typedef struct Node
{
	int data;
	Node* next;
}Node;
Node* head;			//头结点
Node* front;			//队首
Node* rear;				//队尾

2、入队和出队

入队:从队尾放入元素,rear指向新的队尾元素。

出队:从队首取出元素,front指向新的队首元素。

总代码

//链队列
//可以实现自由插入
//链队列用front->next指向队首元素,rear指向队尾元素
//入队rear动;		出队front->next动(front不动)
#include <stdio.h>
#include <malloc.h>

//链队列
typedef struct Node
{
	int data;
	Node* next;
}Node;
Node* head;			//头结点
Node* front;			//队首
Node* rear;				//队尾

void Init_List()
{
	head = (Node*)malloc(sizeof(Node));
	head->next = NULL;
	front = head;
	rear = head;
}

//入队
void EnQueue(int num)
{
	Node* p = (Node*)malloc(sizeof(Node));
	p->data = num;
	p->next = NULL;
	rear->next = p;			//连接p(head不存放值)
	rear = p;						//指向p
}

//出队
int DeQueue()
{
	int num;
	Node* s;
	if (rear == front)
	{
		printf("队列为空!\n");
		return -1;
	}
	s = front->next;
	num = s->data;
	front->next = front->next->next;
	free(s);

	return num;
}

int main()
{
	Init_List();			//初始化

	//入队
	EnQueue(0);
	EnQueue(1);
	EnQueue(2);
	EnQueue(3);

	//出队
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());
	printf("%d\n", DeQueue());

	return 0;
}

可能有写的不好或者不对的地方,希望大家批评指正!Thanks♪(・ω・)ノ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_(*^▽^*)_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值