STL简易list, queue和stack

(STL标准模板库)3.容器的说明和简单应用[deque,queue,stack,list,forward_list,set,map] deque,queue和stack list,forward_list set/map 关联容器额外的类型别名 map pair类型 set类型 阅读详情
#include <iostream>
using namespace std;
class Range{
    int B, E, D;
public:
    class Iterator{
    public:
        int index;
        Range& out;
        Iterator(Range& o, int i): out(o), index(i){}
        void operator++(){
            index += out.D;
        }
        int& operator*(){
            return index;
        }
        int operator*()const {
            return index;
        }
        bool operator!=(Iterator i){
            return out.D * (i.index - index) > 0;
        }
    };
    Range(int b = 0, int e = 0, int d = 1): B(b), E(e), D(d){}
    Iterator begin(){
        return Iterator(*this, B);
    }
    Iterator end(){
        return Iterator(*this, E);
    }
};
template <class T = int>
class List{
public:
    struct Node{
        T data;
        Node *next, *prior;
        Node(const T& data): data(data){prior = next = nullptr;}
    };
protected:
    size_t length;
    Node *head, *tail;
public:
    List(){
        length = 0;
        head = tail = nullptr;
    }
    class Iterator{
        Node* node;
        List& list;
    public:
        Iterator(List& list, Node* node): list(list), node(node){};
        void operator++(){node = node->next;}
        T& operator*()const { return  node->data;}
        T operator*(){return node->data;}
        bool operator!=(Iterator i){return node != nullptr;}
    };
    Iterator begin(){return Iterator(*this, head);}
    Iterator end(){return Iterator(*this, nullptr);}
    virtual size_t size(){ return length;}
    virtual bool empty(){return !length;}
    virtual T& front(){ return head->data;}
    virtual T& back(){ return tail->data;}
    virtual void push_back(const T& o){
        Node *p = new Node(o);
        if(length == 0){
            head = tail = p;
        }else{
            p->prior = tail;
            tail->next = p;
            tail = tail->next;
        }
        length++;
    }
    virtual void push_front(const T& o){
        Node *p = new Node(o);
        if(length == 0){
            head = tail = p;
        }else{
            p->next = head;
            head->prior = p;
            head = head->prior;
        }
        length++;
    }
    virtual bool pop_back(){
        if(length == 0) return false;
        else if(length == 1){
            delete head;
            head = tail = nullptr;
            length--;
            return true;
        }else{
            Node* p = tail;
            tail = tail->prior;
            delete p;
            length--;
            return true;
        }
    }
    virtual bool pop_front(){
        if(length == 0) return false;
        else if(length == 1){
            delete head;
            head = tail = nullptr;
            length--;
            return true;
        }else{
            Node* p = head;
            head = head->next;
            delete p;
            length--;
            return true;
        }
    }
};
template <class T = int>
class Stack: protected List<T>{
public:
    Stack(): List<T>(){}
    virtual size_t size(){return this->length;}
    virtual bool empty(){ return !this->length;}
    virtual T& top(){ return this->front();}
    virtual void push(const T& o){this->push_front(o);}
    virtual T& pop(){ this->pop_front(); }
};
template <class T = int>
class Queue: protected List<T>{
public:
    Queue(): List<T>(){}
    virtual size_t size(){return this->length;}
    virtual bool empty(){ return !this->length;}
    virtual T& front(){ return this->head->data;}
    virtual T& back(){ return this->tail->data;}
    virtual void push(const T& o){this->push_back(o);}
    virtual T& pop(){ this->pop_front(); }
};
int main() {
    cout << endl << "---------------range-----------------" << endl;
    for(auto& i: Range(0, 9)) cout << i << " "; cout << endl;
    for(auto i: Range(0, 9, 2)) cout << i << " "; cout << endl;
    for(auto i: Range(9, -1, -1)) cout << i << " "; cout << endl;
    for(auto i: Range(9, -1, -2)) cout << i << " "; cout << endl;

    cout << endl << "---------------list-----------------" << endl;
    List<int> list;
    for(auto i: Range(0, 4))
        list.push_back(i);
    for(auto item: list)
        cout << item << " ";
    cout << endl;
    while(!list.empty())list.pop_back();
    for(auto i: Range(0, 4))
        list.push_front(i);
    for(auto item: list)
        cout << item << " ";
    cout << endl;

    while(!list.empty())list.pop_front();
    for(auto i: Range(0, 4))
        list.push_back(i);
    for(auto item: list)
        cout << item << " ";
    
    cout << endl << "---------------stack-----------------" << endl;
    Stack<int> stack;
    for(auto i: Range(0, 4))stack.push(i);
    cout << stack.size() << endl;
    cout << stack.top() << endl;
    while(!stack.empty()) {
        cout << stack.top() << " ";
        stack.pop();
    }

    cout << endl << "---------------queue-----------------" << endl;
    Queue<double> queue;
    for(auto i: Range(0, 5)) queue.push(i*1.5);
    cout << queue.size() << endl;
    cout << queue.front() << " " << queue.back() << endl;
    while(!queue.empty()){
        cout << queue.front() << " ";
        queue.pop();
    }
    return 0;
}

随便写下,不喜勿喷。

可能有BUG,请自己测试好

【c++】std list和std queue的区别 queue 阅读详情

相关推荐

c++STL常用容器之List容器——全面总结(附案例解析)(十六)

这里有C++STL——全面总结详细教程(附案例解析)(持续更新中) 目录​​​​​​​ list容器 list基本概念 list构造函数 list 赋值和交换 list 大小操作 list 插入和删除 list 数据存取 list容器 list基本概念 功能:将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中...

cfl997 9972

C++STL容器 ---- 顺序容器之deque、list

顺序容器2---deque:双端队列 1、Deque(doubled-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。 底层数据结构:动态开辟的二维数组,和vector的底层数据结构不同,deque的第二维是按固定大小开辟的,内存扩容时,扩容第一维的数组空间,每次按原空间2倍方式进行扩容,然后把第二维...

Disremembrance的博客 1020

RT_Thread Studio使用——USB虚拟串口(VCP)

RT_Thread Studio使用——USB虚拟串口(VCP)

weixin_44735205的博客 3375

C++新手村装备系列(三):初识STL序列式容器:向量(vector)、列表(list)、双端队列(deque)、栈(stack)、队列(queue)

STL(Standard Template Library)是C++标准模板库的缩写,它是C++标准库的一部分,提供了丰富的通用数据结构和算法。其中,多种多样的容器提供了不同的数据结构,可以满足各种需求。本篇文章介绍了常见的序列式容器,包括向量(vector)、列表(list)、双端队列(deque)、栈(stack)、队列(queue),旨在分享各个容器的实质与简单操作语法,之后也许会对各个容器的底层设计展开分析,希望大家多提建议!谢谢!

2301_80080092的博客 1794

stm32f103运行FreeRTOS使用DMA实现USART1不定长接收

使用DMA是实现USART1的不定长接收和发送数据。接收采用FIFO缓存和队列的方式向应用层抛数据。首先定义接收和发送的缓存区,缓存区的大小根据收发数据量确定。DMA接收开启转移完成和转移一般中断。在中断中从缓存向FIFO转移数据。串口开启空闲中断,实现接收数据的分帧。分帧后的数据节点通过写入到队列。发送数据缓存的大小根据发送数据量调整。然后初始化串口和DMA。串口的发送数据接口函数。...

polaris_zgx的博客 1991

深度学习CV八股文

深度学习CV八股文一、深度学习中解决过拟合方法L1和L2正则化DropoutDropout正则化Inverted Dropout(反向随机失活)Dropout起到正则化效果的原因:Dropout的缺点eargstopping ( 早停法 )二、深度学习中解决欠拟合方法三、梯度消失和梯度爆炸解决梯度消失的方法解决梯度爆炸的方法四、神经网络权重初始化方法Xavier指数加权移动平均数五、梯度下降法梯度下降SGD(随机梯度下降法)Momentum(动量梯度下降)Nesterov Momentum自适应学习率算法A

填坑 2万+

STL中list与queue之间的区别

STL中list与queue之间的区别 list不再能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在; list插入操作和结合才做都不会造成原有的list迭代器失效; list不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针; list不像vector那样有可能在空间不足时做重新配置、数据移动的操作,所以插入前的所有迭代器在插入操作之后都仍然有效; deque是一种双向开口的连续线性空间,所谓双向开口,意思是可以在头尾两端分别做元素的插入

philamar的博客 2333

LeRobot SO100仿真操控避坑指南:从MuJoCo模型调试到实机同步(附参数修正模板)

本文详细解析了LeRobot SO100机械臂在MuJoCo仿真操控中的常见问题与解决方案,包括关节转向符号调试、偏移值校准及实机同步技术。通过实战案例和参数修正模板,帮助开发者高效解决仿真与实机差异,提升机器人开发效率。

weixin_29064009的博客 247

STL:list,stack和queue

详解list,栈和队列

2302_80357424的博客 875

从零开始用 C# 打造工业级上位机系统:完整项目实战

本文介绍了一个基于C#开发的工业级上位机系统项目。该系统采用分层架构设计,包含通信、数据采集、UI展示、告警日志等模块,支持Modbus协议和串口通信。文章详细阐述了系统架构设计、关键模块实现(如Modbus通信封装、实时数据采集、告警系统等)以及性能优化策略。该项目已在实际工控场景中稳定运行超过1年,具备良好的可扩展性和稳定性,适合有一定C#基础的开发者参考学习工业软件开发实践。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1370

《唤醒你的AI同事:WorkBuddy从零上手》004:与其他 AI 工具的对比

把 WorkBuddy 与聊天机器人、办公套件内置 AI、自动化工具逐维对比,并按当前版本补充四项新差距:结果交付、连接器广度、资料库与多模态产出。

LuckyHanMo的博客 683

STL中常用的容器——stack,queue和list容器

一,stack容器 1,stack容器概述: stack 是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式 如图所示。stack 容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端 外,没有任何其他方法可以存取 stack 的其他元素。换言之,stack 不允许有遍历 行为。 有元素推入栈的操作称为:push,将元素推出 stack 的操作称为 pop. 如下: 2.stack迭代器 Stack 所有元素的进出都必须符合”先进后出”的条件,只有 stac

qq_45652092的博客 997

基于物联网设计的蜂箱智能监测系统设计

为解决传统养蜂业依赖人工、管理效率低下、干扰蜂群等问题,本项目设计并实现了一套基于物联网(IoT)的蜂箱智能监测系统。

685

【C++】黑马C++泛型编程和STL技术 (6) STL常用容器 ---stack、queue、list

C++容器的基本知识

Tranquil_ovo的博客 438

LiveBOS UploadFile.do 任意文件上传漏洞复现(XVE-2023-21708)

LiveBOS UploadFile.do 接口存在任意文件上传漏洞,未经身份验证的攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。

0xSec 2426

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STL(标准模板库)-list容器 和 stack容器,queue容器

stack容器 是栈容器: 先进后出的数据结构。 push入栈、pop出栈、top永远指向栈顶元素 stack没有迭代器 queue容器 是队列容器: 队列容器:先进先出 队尾插入数据 对头删除数据 queue容器:没有迭代器 不具备遍历功能 只能通过front、back访问

兰天禄的博客 848

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++进阶与拔高(十)(C++ STL)(vector,list,stack和queue接口操作)

第五章 STL 容器的具体用法 5.1 vector用法总结 5.1.1 介绍        vector可以用来表示一个不定长度的数组,它是一种序列容器。就像数组一样,vector也采用连续的存储空间来存储元素,其中重载了下标操作符“[ ]”,可以对vector元素进行访问。与数组不同的是它的大小是可以动态改变的。当新元素插入容器时,vector不会每次都重新分配大小。与其他动态序列容器相...

Lao_tan的博客 1707

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C++】STL容器(list,stack,queue)

在 C++ 编程的广阔天地中,标准模板库(STL,Standard Template Library)犹如一座宝库,为开发者提供了丰富的数据结构和算法工具。它极大地提高了代码的复用性和开发效率,让我们能够更加专注于解决实际问题。STL 容器作为其中的重要组成部分,是存储和管理数据的有力工具。不同类型的容器适用于不同的场景,而今天,我们将深入探索 list、stack 和 queue 这三种容器的奥秘。list 是 C++ STL 中的一种序列容器,它实现了双向链表的数据结构。

2302_78829275的博客 797

C++基础(13)——STL(stack、queue、list)

本文主要介绍C++中STL中的stack、queue和list容器

weixin_56646002的博客 837

C++ Primer Plus 第六版第十六章主要介绍 string 类和标准模板库(STL),包括 vector, list, queue, stack, map, set, algorithm 等

编写一个程序,让用户输入单词,直到输入 “done” 为止。统计用户输入了多少个单词(不包括 “done”),并显示结果。编写一个程序,提示用户输入一个字符串,并判断它是否是回文。容器重写编程题 4,统计输入的单词数,直到输入 “done”。编写一个程序,要求用户输入一个整数和一个单词,然后使用。编写一个程序,要求用户输入小时数和分钟数,使用一个。// 转换为小写,忽略大小写差异。// 创建字符串的副本。

m0_74823963的博客 503

C++的STL模板set,multiset,map,multimap,deque,list,stack,queue和priority_queue

set实际上是平衡二叉树,需要声明头文件#include<set> Insert:将元素插入集合中 使用前向迭代器对集合中序遍历 使用反向迭代器reverse_iterator可以反向遍历集合,需要用到rbegin()和rend()方法。 erase:删除的对象可以是某个迭代器位置上的元素、等于某键值的元素、一个区间上的元素和清空集合(clear)。 find:对集合...

weixin_30437337的博客 69

【C++ 面试 - STL】每日 3 题(三)

​✍个人博客:Pandaconda-优快云博客📣专栏地址:http://t.csdnimg.cn/fYaBd📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~

Newin2020的博客 1466

【STL】stack、queue基本使用和模拟实现

stack 和 queue 又被称为容器配接器,在底层实现方面与我们传统想法又大有不同,今天揭开其神秘的面纱,一起来学习吧✨✨

Lin_Alpaca的博客 1328

【C++】 STL -- 容器(2)

本篇文章将讲到Stack容器,Queue容器,Lise容器。

2301_80035097的博客 1203

STL教程6-deque、stack、queue、list容器

前后两端都能插入和删除,push_front(),pop_front(),push_back(),pop_back() 特点 2)赋值操作assign 3)swap交换内存空间 4)大小操作size()、empty()、resize(n) 5)插入和删除和查看数据 pop_front()没有返回值 二、stack容器 在STL中 queue 和 stack 其实并不叫容器(container),而是叫适配器(adapter),他们是对容器的再封装。 stack是一种“先进后出”的结构。栈不能遍历,不支

baidu_41553551的博客 705

stack,queue和list容器

stack容器 基本概念 stack容器其实就是栈,先进后出。 stack常用接口 构造函数: stackstk; 和其它容器一样 stack(const stack&stk) 拷贝构造函数 赋值操作: stack&operator=(const stack&stk)重载等号操作 数据存取 push(elem) 向栈顶添加元素 pop() 从栈顶移除第一个元素 top() 返回栈顶元素 大小操作

weixin_50911232的博客 485
上一篇: Eilxir解决哲学家就餐问题
下一篇: UVALive 7269 Snake Carpet
badopencoder
博客等级 码龄10年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值