【数据结构队列在队尾指向不同位置时的不同使用方式】
数据结构的队尾指向不同导致不同的理解
在考研的过程中对栈与队列那一节的队尾指向不同位置时的不同使用方式有些迷迷糊糊,所以就用了些时间梳理出来
指针指向队尾的下一个元素时有
牺牲一个存储单元时
#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标识位在这里和上面的基本一致就不再做赘述