当前位置: 首页 > article >正文

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

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

#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;
}

image.png

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

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

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


http://www.kler.cn/a/144580.html

相关文章:

  • 如何避免死锁
  • 关于银河麒麟操作系统黑屏问题
  • 小程序Canvas 2D问题解决,如安卓drawImage不执行、动态高度设置、高度1365(或4096)限制等
  • t检验(连续变量)和卡方检验(分类变量)
  • 合共软件创新亮相:第102届上海电子展成就技术新篇章
  • LemMinX-Maven:帮助在eclipse中更方便地编辑maven的pom文件
  • 重生之我是一名程序员 41 ——字符串函数(2)
  • pytorch模型优化简介,未完结版
  • CSS3媒体查询实现不同宽度的下不同内容的展示
  • 力扣刷题第三十一天--二叉树
  • linux账户管理实例二
  • IDEA中常用快捷键
  • 【uniapp】uniapp开发小程序定制uni-collapse(折叠面板)
  • LeetCode.203移除链表元素(原链表操作、虚拟头结点)
  • 新的centos7.9安装jenkins—(一)
  • Using the File Class使用文件类
  • 测试在 Oracle 下直接 rm dbf 数据文件并重启数据库
  • 1、Mysql架构与历史
  • Android修行手册-一个滑动旋转的弧形菜单
  • 性能压测工具:wrk