【数据结构/C++】栈和队列_循环队列

牺牲一个存储单元来判断队满。

cpp 复制代码
#include<iostream>
using namespace std;
// 循环队列
#define MaxSize 10
typedef int ElemType;
typedef struct {
  ElemType data[MaxSize];
  int front, rear;
} SqQueue;
// 初始化队列
void InitQueue(SqQueue &Q) {
  // 判断队空 Q.rear == Q.front
  Q.front = Q.rear = 0;
}
// 入队
bool EnQueue(SqQueue &Q, ElemType x) {
  // 队尾指针的后一个位置为队头指针 即队满
  if((Q.rear + 1 % MaxSize == Q.front)) {
    return false;
  }
  // 队尾指针指向队尾元素的后一个位置
  Q.data[Q.rear] = x;
  // 队尾指针后移
  Q.rear = (Q.rear + 1) % MaxSize;
  return true;
}
// 出队
bool DeQueue(SqQueue &Q, ElemType &x) {
   if (Q.front == Q.rear) {
    return false;
   }
   x = Q.data[Q.front];
   Q.front = (Q.front + 1) % MaxSize;
   return true;
}
// 遍历
void Traverse(SqQueue Q) {
  for (int i = Q.front; i < Q.rear; i++) {
    cout << Q.data[i] << " ";
  }
  cout << endl;
}
// 长度
int QueueLength(SqQueue Q) {
  return (Q.rear - Q.front + MaxSize) % MaxSize;
}
int main() {
  SqQueue Q;
  InitQueue(Q);
  ElemType x;
  EnQueue(Q, 1);
  EnQueue(Q, 2);
  EnQueue(Q, 3);
  EnQueue(Q, 4);
  DeQueue(Q, x);
  cout << "出队元素为:" << x << endl;
  cout << "队列长度为:" << QueueLength(Q) << endl;
  Traverse(Q);
  return 0;
}

特殊地,如果队尾指针指向的是队尾元素:

cpp 复制代码
// 判断空
// 队尾指针的后一个位置就是队头指针
(Q.rear + 1) % MaxSize == Q.front
// 判断满
// 队尾指针的后两个位置就是队头指针,后一个位置为空

当然,还可以加一个变量比如 size 或者 tag 来进行判断。

相关推荐
starzy199041 分钟前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
布莱克6051 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
汉克老师1 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
吴可可1231 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言
岑梓铭2 小时前
《考研408数据结构》第八章(排序)复习笔记
数据结构·笔记
晴天的雨.9922 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime2 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven3 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981033 小时前
c++ lamda(三)Lambda表达式
java·前端·c++