算法模版:模拟数据结构之队列

简介: 算法模版:模拟数据结构之队列

前言


唤我沈七就好啦。

这是模拟数据结构系列。

以下是之前同系列文章。


模拟数据结构之绪论

模拟数据结构之链表

模拟数据结构之栈


本次讲解的是队列。

因为队列和栈很类似,大家可以对比着去记。


什么是队列?


相关概念

队头:允许元素删除的一端。

队尾:允许元素插入的一端。

入队:队列的插入操作。

出队:队列的删除操作。


特点:先进先出。

即后面的元素需要等先进来的元素在队头出队后才能出队。

这是因为队列中的元素只能在队尾入队在队头出队,即入口只能入,出口只能出。可以通过下图来辅助理解。

队列也是线性表的一种,可以理解为仅能在两端插入和删除的数组。

8.png


实现思路


前面提到,队列可以理解为仅能在两端插入和删除的数组。而这正是我们实现思路。


实现方法


1 .创建变量


int qu[N]; 储存队列元素的数组
int hh=0;  队头
int tt=-1; 队尾
初始化很重要!!!


将队尾变量初始化为 -1 是为了方便最后判断队是否为空。


2 . 插入操作

if(a=="push")
 cin>>x;
 qu[++tt]=x;  元素只能在队尾入队


当输入 push 5 时 ,5这个元素就入队了。

注意这里一定要是 ++tt 让下标是0, 因为 tt 初始化的是 -1。

如果 tt++ 下标就是 - 1 了。


3 .删除操作


else if(a=="pop")
hh++;
注意元素只能队头弹出,且是 ++


当输入 pop 5 时 ,5这个元素就出队了。

注意这里确实并没有真正删除放在队尾的元素,但队尾上升了一位,就可以理解为删除了下一位。

这里也不需要考虑空间浪费问题。


4 .判断队空

else if(a=="empty")   队内是否为空
{
       if(tt<hh)
       cout<<"YES"<<endl;
       else
       cout<<"NO"<<endl;
 }


因为 tt 初始化的时候是 -1,所以如果 tt << hh 就说明没有任何元素插入过。

当输入 empty 时 ,返回 YES队就为空 , 返回 NO 队就非空。


完整模板

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int qu[N],hh=0,tt=-1;//初始化很重要!!!
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        string a;
        cin>>a;
        if(a=="push")
        cin>>x,qu[++tt]=x;//元素只能队尾入队
        else if(a=="pop")
        hh++;//注意元素只能队头弹出,且是 ++
        else if(a=="empty")//队内是否为空
        {
            if(tt<hh)
            cout<<"YES"<<endl;
            else
            cout<<"NO"<<endl;
        }
        else//查询队头
        cout<<qu[hh]<<endl;
    }
    return 0;
}


完结散花


ok以上就是对模拟数据结构之队列的全部讲解啦,很感谢你能看到这儿啦。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。


参考文章


https://www.acwing.com/


相关文章
|
3天前
|
存储 Java
【数据结构】优先级队列(堆)从实现到应用详解
本文介绍了优先级队列的概念及其底层数据结构——堆。优先级队列根据元素的优先级而非插入顺序进行出队操作。JDK1.8中的`PriorityQueue`使用堆实现,堆分为大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆则相反。文章详细讲解了如何通过数组模拟实现堆,并提供了创建、插入、删除以及获取堆顶元素的具体步骤。此外,还介绍了堆排序及解决Top K问题的应用,并展示了Java中`PriorityQueue`的基本用法和注意事项。
16 5
【数据结构】优先级队列(堆)从实现到应用详解
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
12天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
14 0
【数据结构】栈和队列的深度探索,从实现到应用详解
|
1月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
1月前
|
机器学习/深度学习 算法 文件存储
【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search
本文提出了一种名为渐进式神经架构搜索(Progressive Neural Architecture Search, PNAS)的方法,它使用顺序模型优化策略和替代模型来逐步搜索并优化卷积神经网络结构,从而提高了搜索效率并减少了训练成本。
34 9
【数据结构】栈和队列
【数据结构】栈和队列
|
1月前
|
存储
【数据结构】栈和队列-->理解和实现(赋源码)
【数据结构】栈和队列-->理解和实现(赋源码)
25 5
|
28天前
|
机器学习/深度学习 消息中间件 缓存
栈与队列的实现
栈与队列的实现
37 0
|
1月前
|
测试技术
【初阶数据结构篇】队列的实现(赋源码)
首先队列和栈一样,不能进行遍历和随机访问,必须将队头出数据才能访问下一个,这样遍历求个数是不规范的。
|
1月前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势