队列的基本概念

队列:是一种操作受限的线性表(特殊线性表),只允许在队头进行删除操作在队尾进行插入操作操作特性是先进先出。(类似于生活中的排队买饭)

队头、队尾、空队列(不含有任何元素的空表)。

栈和队列都是操作受限的线性表,不是任何对线性表的操作都可以作为栈和队列的操作。(不可随便读取栈或队列中间的某个数据)。

1.队列的顺序存储

是指分配一块连续的存储单元存放队列中的元素,并附设两个指针;队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置(不同教材,定义不一样)

初始状态(队空的条件):Q.front==Q.rare==0;

进队操作:队不满时,先送值到队尾元素,再将队尾指针加一

出队操作:队不为空时,先取队头元素,再将队头指针加一

注意:不能用Q.rare==MaxSize代表队满(因为假溢出时队并不满,此时满足前述条件)

2.循环队列

为了解决假溢出引入了循环队列,将顺序队列臆造为一个环状的空间,把存储队列元素的表从逻辑上视为一个环。

当队首指针Q.front=MaxSize-1时,再前进一个位置就自动到0。

初始值:Q.front=Q.rear=0

队首指针进1:Q.front=(Q.front+1)%MaxSize;

队尾指针进1:Q.rear=(Q.rear+1)%MaxSize;

一般为了区分队空和队满需要浪费一个队列单元来区分,(即一般队尾指针和队头指针相隔一个空白单元)。

此时就有Q.front==Q.rear时队为空,当[Q.rear+1]%MaxSize==Q.front时为满

队列中的元素个数就有(Q.rear+MaxSize-Q.front)%MaxSize;

注意:对于区分队空队满条件时还可以设置一个中间变量来判断;例如设置一个整形

1.int x来记录插入元素的个数,每次插入一个元素X自加一,删除自减一所以此时

队满:Q.rear==Q.front&&x==Maxsize;

队空:Q.rear==Q.front&&x==0;

2.或者增设一个变量tag,int tag;使得每次插入成功令tag=1;每次删除成功令tag=0;此时

队满:Q.rear==Q.front&&tag==1;

队空:Q.rear==front&&tag==0;

入队操作

1.对于rear指向队尾元素下一个位置

Q.data[Q.rear]=x;

Q.rear=(Q.rear+1)%MaxSize;

2.对于rear指向队尾元素

Q.rear=(Q.rear+1)%MaxSize;

Q.data[Q.rear]=x;

此时判空条件为

(Q.rear+1)%MaxSize=Q.front

出队操作

x=Q.data[Q.front];

Q.front=(Q.front+1)%MaxSize;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

绞尽脑汁想个网名

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

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

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

打赏作者

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

抵扣说明:

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

余额充值