循环队列判断队空和队满_关于循环队列顺序表示和实现

本文介绍了循环队列的基本性质,包括先进先出的特性,并详细阐述了如何通过结构体表示顺序栈。重点讨论了判断队列是否为空或满的条件,以及入队、出队的操作。还给出了显示先入队列数据的代码示例。
摘要由CSDN通过智能技术生成

队列的性质

队列满足的基本性质为先进先出,后进后出。

eg:生活中类似于排队打饭一样,先排队的先打饭。

一,关于顺序栈的结构体表示

结构体定义

struct Node{ int data[MaxSize]; //存放队列的数组 int front; //队尾 int rear; //队头};

图解:

a7940519a518e91d8167b71e05c06b6d.png
873ce7409b17b8cd5383c7913046671d.gif

如上图可以得出:

  • 判断队列满的方法就是队尾加1除以队长跟队头位置是否相等。即(S->rear+1)%Size==S->front
  • 判断队列为空的方法就是队头跟队尾位置是否相等。即S->front==S->rear
  • 这里可以当作,队列满是看队头是否能追上队尾
  • 队列空,是看队尾是否能追上队头
  • 此处将n-1就定义为满队列的原因是,若全部都存入数据,则S->front与S->rear相等,与空栈情况一样。

循环队列的定义

Node *Init(){Node *S = new Node;S->front = S->rear = 0;return S;}
873ce7409b17b8cd5383c7913046671d.gif

即简单初始化队头队尾,都指向队列底就行,也就是赋值为0.


入队

void Enter(Node &S){if ((S.rear + 1) % MaxSize != S.front)    //判断是否为满队列{cout << "输入要进入队列的值:";cin >> *(S.data + S.rear);S.rear = (S.rear + 1) % MaxSize;}else{cout << "队列已满" << endl;}}
873ce7409b17b8cd5383c7913046671d.gif

先判断是否为满队列,若队列已满,则不能继续存数据


出队列

void Delete(Node &S){if (S.front != S.rear)                  //队列不为空{S.front = (S.front + 1) % MaxSize;}else{cout << "队列为空" << endl;}}
873ce7409b17b8cd5383c7913046671d.gif

队列的性质是先进先出,所以先判断队列是否为空,若不为空,则先出先进的,即存放在队尾的数据


显示先入队列的数据

void Show(Node *S){cout << "队头元素为:";cout << *(S->data + S->front) << endl;}
873ce7409b17b8cd5383c7913046671d.gif

代码:

#includeusing namespace std;#define MaxSize 20struct Node{int data[MaxSize];int front;int rear;};Node *Init(){Node *S = new Node;S->front = S->rear = 0;return S;}void Enter(Node &S){if ((S.rear + 1) % MaxSize != S.front){cout << "输入要进入队列的值:";cin >> *(S.data + S.rear);S.rear = (S.rear + 1) % MaxSize;}else{cout << "队列已满" << endl;}}void Delete(Node &S){if (S.front != S.rear)                  //队列不为空{S.front = (S.front + 1) % MaxSize;}else{cout << "队列为空" << endl;}}void Show(Node *S){cout << "队头元素为:";cout << *(S->data + S->front) << endl;}int main(){Node *S = Init();Enter(*S);Enter(*S);Enter(*S);Show(S);Delete(*S);Show(S);system("pause");}
873ce7409b17b8cd5383c7913046671d.gif
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值