【算法入门】设计模板队列|循环队列(下)

简介: 【算法入门】设计模板队列|循环队列

2、AB8 【模板】循环队列

题目链接:循环队列


在上面题的基础上,加了循环的特点,思考一下队空或者队满的条件即可解题


题目描述:

e00df062a3cc4c11b88e9ff609a0b9c0.png

0f5a969f10a448c08ead9d13f3613a57.png


2.1、解题思路

根据输入描述可以知道循环队列可利用空间大小是由我们输入的,提前并不可知,因此直接封装成一个队列类不太合适。所以我把队列当作数组来处理,根据方法的要求来设计循环队列:


当队首指针front和队尾指针rear相等时,代表的要么是队空或者队满:

我们可以把front==rear当作队空的条件

队满的判断:

当循环队列中只剩下一个空存储单元时,队列就已经满了,

因此队满条件为:(rear+1)%(n+1)==front

push操作先判断队列是否已满,如果满就输出full,反之元素入队,队尾指针rear循环

front操作先判断队列是否为空,如果空就输出empty,反之打印队首指针对应的元素

pop操作在front的基础上将队首指针front循环

2.2、代码实现及解析

本题源码:

#include <iostream>
using namespace std;
const int N = 100001;
int a[N];
int front, rear = 0;
int n, q;
int MAXSIZE;
int main() {
    cin >> n >> q;
    string oper;
    MAXSIZE = n + 1;
    while (q--) {
        cin >> oper;
        if (oper == "push") {
            //判断队满条件:front == (rear + 1) % MAXSIZE
            if (front == (rear + 1) % MAXSIZE) {
                int x;
                cin >> x;
                cout << "full" << endl;
            } else {
                int x;
                cin >> x;
                a[rear] = x;
                rear = (rear + 1) % MAXSIZE;
            }
        } else if (oper == "front") {
          //判断队空条件:front==rear
            if (rear == front) {
                cout << "empty" << endl;
            } else {
                cout << a[front] << endl;
            }
        } else {
          //判断队空条件:front==rear
            if (rear == front) {
                cout << "empty" << endl;
            } else {
                cout << a[front] << endl;
                front = (front + 1) % MAXSIZE;
            }
        }
    }
    return 0;
}

重要注释:


main函数之前是一些变量的声明和初始化,MAXSIZE等于n+1,用来更新指针

对此题而言栈满时push操作仍然需要从键盘上输入元素,否则将和输出结果不匹配

三种操作都需要事先判断栈空或者栈满,push和pop更新指针的操作一定不要漏掉

队列和循环队列的设计算法到此结束,下篇文章将更新链表的基本操作,期待你的关注!


目录
相关文章
|
2天前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
2天前
|
存储 算法
【数据结构和算法】--队列的特殊结构-循环队列
【数据结构和算法】--队列的特殊结构-循环队列
6 0
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习算法入门:从K-means到神经网络
【6月更文挑战第26天】机器学习入门:从K-means到神经网络。文章涵盖了K-means聚类、逻辑回归、决策树和神经网络的基础原理及应用场景。K-means用于数据分组,逻辑回归适用于二分类,决策树通过特征划分做决策,神经网络则在复杂任务如图像和语言处理中大显身手。是初学者的算法导览。
|
2天前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
|
2天前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
3天前
|
算法 Java 数据处理
Java算法模板 数据流快读
Java算法模板 数据流快读
8 2
|
5天前
|
自然语言处理 算法
ransformers从入门到精通:常用的subword tokenizer算法
- WordPiece、BPE/BBPE最小字词进行合并最终字词,BPE/BBPE直接采用词频判断合并规则而WordPiece采用最大似然的方式 - unigram采用从最大的字词集合里移除那些对语料库整体概率贡献最小的子词【6月更文挑战第7天】
16 3
|
3天前
|
算法
【C/数据结构和算法】:栈和队列
【C/数据结构和算法】:栈和队列
12 1
|
3天前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
11 1
|
15天前
|
机器学习/深度学习 数据采集 算法
机器学习入门:算法与数据的探索之旅
【6月更文挑战第13天】本文介绍了机器学习的基础,包括算法和数据处理的重要性。机器学习算法分为监督学习(如线性回归、决策树)、非监督学习(如聚类、降维)和强化学习。数据处理涉及数据清洗、特征工程、数据分割及标准化,是保证模型性能的关键。对于初学者,建议学习基础数学、动手实践、阅读经典资料和参与在线课程与社区讨论。