数据结构的队尾指向不同导致的不同算法

【数据结构队列在队尾指向不同位置时的不同使用方式】

数据结构的队尾指向不同导致不同的理解

在考研的过程中对栈与队列那一节的队尾指向不同位置时的不同使用方式有些迷迷糊糊,所以就用了些时间梳理出来

指针指向队尾的下一个元素时有

牺牲一个存储单元时

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 20
typedef int  Elemtype;
typedef struct {
	Elemtype data[MaxSize];
	Elemtype front, rare;
}Queue;
//在rare指向队尾的下一个元素时
//初始化队列
bool InitQueue(Queue& Q) {
	Q.front = Q.rare = 0;
}
bool pushQueue(Queue& Q,Elemtype p) {
	//判断队满的操作
	if ((Q.rare + 1) % MaxSize == Q.front) return false;
	p = Q.data[Q.rare];
	Q.rare = (Q.rare + 1) % MaxSize;
}
bool POpQueue(Queue& Q, Elemtype& p) {
	//判断队空的操作
	if (Q.rare==Q.front)  return false;
	p = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;
}
Elemtype duichang(Queue Q, Elemtype s) {
	s = (Q.rare - Q.front) % MaxSize;
}

添加Tag的标识位时

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 20
typedef int  Elemtype;
typedef struct {
	Elemtype data[MaxSize];
	Elemtype front, rare;
	Elemtype Tag;//添加标识为位置
}Queue;
//在rare指向队尾的下一个元素时
//初始化队列
bool InitQueue(Queue& Q) {
	Q.front = Q.rare = 0;
	Q.Tag = 0;
}
bool pushQueue(Queue& Q, Elemtype p) {
	//判断队满的操作
	if (Q.Tag==1&&Q.front==Q.rare)  return false;
	p = Q.data[Q.rare];
	Q.rare = (Q.rare + 1) % MaxSize;
	Q.Tag = 1;
}
bool POpQueue(Queue& Q, Elemtype& p) {
	//判断队空的操作
	if (Q.Tag == 0 && Q.front == Q.rare)  return false;
	p = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;
	Q.Tag = 0;
}
Elemtype duichang(Queue Q, Elemtype s) {
	s = (Q.rare - Q.front) % MaxSize;
}

添加Size的标识位时

在这里插入图片描述
这张图里注释的时候将队列注释成了栈,有些问题,大家凑合看

指针指向队尾的元素时有

牺牲一个存储单元时

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 20
typedef int  Elemtype;
typedef struct {
	Elemtype data[MaxSize];
	Elemtype front, rare;
}Queue;
//在rare指向队尾元素时
//初始化队
bool InitQueue(Queue& Q) {
	Q.front = 0;
	Q.rare = MaxSize-1;//指向最后的一个地址
}
bool pushQueue(Queue& Q, Elemtype p) {
	//判断队满的操作
	if ((Q.rare + 2) % MaxSize == Q.front) return false;
	Q.rare = (Q.rare + 1) % MaxSize;//先向下指一个再走
	p = Q.data[Q.rare];
}
bool POpQueue(Queue& Q, Elemtype& p) {
	//判断队空的操作
	if ((Q.rare + 1) % MaxSize == Q.front)  return false;
	p = Q.data[Q.front];//先取值在向下走
	Q.front = (Q.front + 1) % MaxSize;
}
Elemtype duichang(Queue Q, Elemtype s) {
	s = (Q.rare+1 - Q.front) % MaxSize;
}

剩下的两种加Size,加Tag标识位在这里和上面的基本一致就不再做赘述

开始写个人感悟记载不久,有错误大家可以随意指出,就当是理解讨论了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值