算法模版:模拟数据结构之队列【沈七】

前言

唤我沈七就好啦。
这是模拟数据结构系列。
以下是之前同系列文章。

模拟数据结构之绪论
模拟数据结构之链表
模拟数据结构之栈

本次讲解的是队列。
因为队列和栈很类似,大家可以对比着去记。

什么是队列?

相关概念
队头:允许元素删除的一端。
队尾:允许元素插入的一端。
入队:队列的插入操作。
出队:队列的删除操作。
特点:先进先出。
即后面的元素需要等先进来的元素在队头出队后才能出队。
这是因为队列中的元素只能在队尾入队在队头出队,即入口只能入,出口只能出。可以通过下图来辅助理解。
队列也是线性表的一种,可以理解为仅能在两端插入和删除的数组。
在这里插入图片描述

实现思路

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

实现方法

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/

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沈七QWQ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值