【数据结构/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 来进行判断。

此外,期末考试版(O.o):

#include <iostream>
using namespace std;
#define MaxSize 10
// 循环队列
typedef struct
{
  int data[MaxSize];
  int front;
  int back;
} CQueue;
// 初始化循环队列
void InitQueue(CQueue &Q)
{
  Q.front = Q.back = 0;
}
// 求循环队列元素个数
int GetSize(CQueue &Q)
{
  int size = (Q.back - Q.front + MaxSize) % MaxSize;
  return size;
}
// 入队
bool EnQueue(CQueue &Q, int x)
{
  // back 的后一位如果是 front 的话则队满
  // 如果 back 和 front 处于同一位的话则队空
  int newBack = (Q.back + 1) % MaxSize;
  if (newBack == Q.front)
  {
    return false;
  }
  Q.data[Q.back] = x;
  Q.back = newBack;
  return true;
}
// 出队
bool DeQueue(CQueue &Q, int &x)
{
  if (Q.front == Q.back)
  {
    return false;
  }
  x = Q.data[Q.front];
  Q.front = (Q.front + 1) % MaxSize;
  return true;
}
int main()
{
  CQueue Q;
  Q.front = Q.back = 0;
  int x;
  EnQueue(Q, 1);
  EnQueue(Q, 2);
  cout << GetSize(Q) << endl;
  DeQueue(Q, x);
  cout << x << endl;
  return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值