[数据结构]线性表的顺序存储-队列

FIFO队列定义

在这里插入图片描述

顺序队列

采用顺序表实现的队列称为顺序队列

  • 进队判断是否已满
  • 这个队列是否为空,即判断首尾两个指向同一单元
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int front;
int rear;
}sequenxe_quene;

队列初始化

void init(sequence_quene *sq)
{
	sq->front=sq->rear=0;
}

判断队列是否为空

int empty(sequence_quene sq)
{
	return (sq.front==sq.rear?1:0);
}
void

打印队列的结点值

{
	int i;
	if(empty(sq))
		printf("\n顺序队列是空的"else
		for(i=sq.front;i<sq.near;i++)//对尾的前一个数
			printf("%5d",sq。a[i]);
}

取得队列的队首结点值

datatype get(squence_squene sq)
{
if(empty(sq))
{
	printf("\n队列是空的,无法获得队首结点值");
	exit(1);
}
else
{
	return sq.a[sq.front];
}
}

进队操作(插入)

void insert(sequrnce_squene *sq,datatype x)//注意是修改操作,不是引用操作,所以要指针
{
	int i;
	if(sq->rear==MAXSIZE)
		printf("顺序表是满的")exit(1);
	sq->a[sq->rear]=x;//数据放在rear位置
	sq->rear=sq->rear+1;//rear加1
	//也可以写成 sq->a[sq->rear++]=x;
}

出队(删除操作)

void dele(squence_squene *sq)
{
	if(sq->front==sq->rear)
	{
	printf("\n顺序队列是空的,不能操作")exit(1)
}
sq->front++;//往后加一个,表示前面的删除了
}

如果出现假溢出现象
在这里插入图片描述
使队列首尾相接

循环队列

在这里插入图片描述
在入队出队的时候不变,但是当头尾指针指向向量上界(MAXSIZE-1)时,其操作结果是指向向量下界0

if(real+1==MAXSIZE)
	rear=0
else rear++

利用模运算可简化为

rear=(rear+1)%MAXSIZE
//当rear<MAXSIZE时,仍为本身,超过取余
  • 出现问题:在循环队列中,rear==front
    可能为空,可能是满

  • 解决方法:
    在这里插入图片描述

  • 第二种方法:
    在这里插入图片描述

  • 循环队列满的条件是

(rear+1)%MAXSIZE==front
  • 循环队列空的条件是
  • rear==front

循环队列插入操作

void insert(sequrnce_squene *sq,datatype x)//注意是修改操作,不是引用操作,所以要指针
{
	if(sq->(real+1)%MAXSIZE==sq->front)
		printf("顺序表是满的")exit(1);
	sq->a[sq->rear]=x;//数据放在rear位置
	sq->rear=(sq->rear+1)%MAXSIZE;
}

循环队列的删除操作

void dele(squence_squene *sq)
{
	if(sq->front==sq->rear)
	{
	printf("\n顺序队列是空的,不能操作")exit(1)
}
sq->front==(sq->front+1)%MAXSIZE;//往后加一个,表示前面的删除了
}

练习1

在这里插入图片描述
e1进e1出e2e3e4进e4出e3出e5e6进e6e5e1出
C

练习2

在这里插入图片描述
D
先进先出,插入的那端为队尾,删除的那端为队首

课后答疑

在这里插入图片描述
少用了一个单元,当尾指针+1等于头指针,表示已满

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值