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

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

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更新指针的操作一定不要漏掉

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


目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
28天前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
33 0
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
26 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
2月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
3月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
2月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
12天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。