队列的定义&队列的顺序实现

 

目录

队列的定义

队列的顺序实现

重点!!!判断队列的已满/已空


队列的定义

队列(Queue):只允许在一端进行进行插入,在另一端删除的受限制的线性表

特点:先进先出(FIFO)First in First Out

队头(rear):允许删除元素的一端

队尾(front):允许插入元素的一端

队列的基本操作:

InitQueue(&Q):初始化队列)。

DestroyQueue(&Q):销毁队列。

EnQueue(&Q,x):入队,若队列Q未满,将x加入到队尾,使之成为新的队尾。

DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,用x返回。

GetQueue(Q,&x):读队头元素,若队列Q非空,则将队头元素赋给x。

队列的顺序实现

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

#define MaxSize 100
typedef struct {
	int* data;
	int rear, front;
}SqQueue;

front:指向队头元素 

rear:指向队尾元素的后一位置(下一个应该插入的位置 )

初始化

//初始化
int InitQueue(SqQueue& S)
{
	S.data = (int*)malloc(MaxSize * sizeof(int));
	if (!S.data)
		return 0;
	S.rear = S.front = 0;
	return 1;
}

判断是否为空

//判断是否为空
int EmptyQueue(SqQueue S)
{
	if (S.rear == S.front)
		return 1;
	else
		return 0;
}

求队列长度

//求队列的长度
int QueueLength(SqQueue S)
{
	return (S.rear - S.front + MaxSize) % MaxSize;
}

我的入队和出队采用的时牺牲一个存储空间的写法 

入队

//入队:在队尾rear插入元素
int EnQueue(SqQueue& S, int x)
{
	if ((S.rear + 1) % MaxSize == S.front)//判断是否已满
		return 0;
	S.data[S.rear] = x;//插入元素x
	S.rear = (S.rear + 1) % MaxSize;//将rear移动一位
	return 1;
}

出队

//出队:在队头front删除元素
int DeQueue(SqQueue& S, int& x)
{
	if (S.rear == S.front)//判断是否为空
		return 0;
	x = S.data[S.front];//用x来返回删除的元素的值
	S.front = (S.front + 1) % MaxSize;//将front要移动一位
	return 1;
}

读队头元素(不删除元素)

//读队头元素
int GetQueue(SqQueue S,int&x)
{
	if (S.rear == S.front)
		return 0;
	x = S.data[S.front];
	return 1;
}

重点!!!判断队列的已满/已空

三种方法

F1:最常用的一种(牺牲一个存储空间)

已空:S.front == S.rear;

已满:(S.rear+1) % MaxSize ==S.front;

F2:设置标志位

#define MaxSize 100
typedef struct {
	int* data;
	int rear, front;
	int tag;//标志位
}SqQueue;

初始化时rear = front = 0; tag = 0;

每次删除成功时,令 tag = 0;

每次删除成功时,令 tag = 1;

队空的条件:front == rear && tag == 0;

队满的条件:front == rear && tag == 1;

F3:增加一个size记录队列的长度

#define MaxSize 100
typedef struct {
	int* data;
	int rear, front;
	int size;//用size记录队列的长度
}SqQueue;

初始化时:front == rear = 0; size = 0;

队空条件:size == 0;

队满条件:size == MaxSize;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

此情可待成追忆w

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

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

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

打赏作者

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

抵扣说明:

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

余额充值