C++stackqueue

news2025/1/12 9:50:55

目录

一、stack

1.1 简要介绍

1.2 小试身手

1.3 模拟实现

二、queue

2.1 简要介绍

2.2 小试身手        

2.3 模拟实现

三、deque

3.1 简要介绍

3.2 分析底层        

四、priority_queue

4.1 简要介绍

4.2 小试身手

4.3 模拟实现

五、仿函数/函数对象 

5.1 简要介绍        



一、stack

1.1 简要介绍

        鉴于读者如果阅读到本文,应该对上述函数(empty、size、push_back等)基本用法和功能有一定了解,因此不再赘述。读者可以在queue - C++ Reference (cplusplus.com)查询详细内容        

1.2 小试身手

150. 逆波兰表达式求值icon-default.png?t=N7T8https://leetcode.cn/problems/evaluate-reverse-polish-notation/参考解法:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for (auto& s : tokens) 
        {
            if (s == "+" || s == "-" || s == "*" || s == "/") 
            {
                int right = st.top();
                st.pop();
                int left = st.top();
                st.pop();
                switch(s[0])
                {
                    case '+':
                        st.push(left+right);
                        break;
                    case '-':
                        st.push(left-right);
                        break;
                    case '*':
                        st.push(left*right);
                        break;
                    case '/':
                        st.push(left/right);
                        break;
                    default:
                        break;
                }
            }
            else 
            {
                st.push(stoi(s));
            }
        }
        return st.top();
    }
};

        

1.3 模拟实现

#pragma once

#include <vector>
//#include <deque>

namespace myContainer
{    
    template<class T, class Container = vector<T>>    // 复用vector
    //template<class T, class Container = deque<T>>    // 复用deque
    class stack
    {
    public:
        
        void push(const T& x)
        {
            _con.push_back(x);
        }
        void pop()
        {
            _con.pop_back();
        }
        T& top()
        {
            return _con.back();
        }
        const T& top()const
        {
            return _con.back();
        }
        size_t size()const
        {
            return _con.size();
        }
        bool empty()const
        {
            return _con.empty();
        }
    private:
        Container _con;
    };
}

效果演示:

        

        


二、queue

2.1 简要介绍

        

2.2 小试身手        

102. 二叉树的层序遍历icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal/参考解法:

​
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> q;
        int levelSize = 0;
        if (root)
        {
            q.push(root);
            levelSize = 1;
        }

        vector<vector<int>> vv;
        while (!q.empty())
        {
            vector<int> v;
            while (levelSize--)
            {
                TreeNode* front = q.front();
                q.pop();
                v.push_back(front->val);
                if (front->left)
                {
                    q.push(front->left);
                }
                if (front->right)
                {
                    q.push(front->right);
                }
            }

            vv.push_back(v);
            // 队列中的数据个数就是下一层的数据个数
            levelSize = q.size();
        }
        return vv;
    }
};

​

        

2.3 模拟实现

#pragma once

#include <deque>

namespace myContainer
{
    template<class T, class Container = deque<T>>
    class queue
    {
    public:
        
        void push(const T& x)
        {
            _con.push_back(x);
        }
        void pop()
        {
            _con.pop_front();
        }
        T& front()
        {
            return _con.front();
        }
        T& back()
        {
            return _con.back();
        }
        const T& front()const
        {
            return _con.front();
        }
        const T& back()const
        {
            return _con.back();
        }
        size_t size()const
        {
            return _con.size();
        }
        bool empty()const
        {
            return _con.empty();
        }
    private:
        Container _con;
    };
}

效果演示:

        

        


三、deque

deque -- 双队列        

3.1 简要介绍

        deque结合了vector和list两者的优势并融合起来,同时必然地,deque比不过vector和list的优势区间,deque就好比一个六边形战士,杂而不精。deque的用法与vector和list几乎相同,这里不再赘述。先前我们模拟实现stack和queue的时候也都可以复用deque。      

3.2 分析底层        

        

        


四、priority_queue

priority_queue -- 优先级队列

4.1 简要介绍

我们可以看到,优先级队列的底层实际上是vector,但是数据的排列方式更像是堆

使用演示:

4.2 小试身手

215. 数组中的第K个最大元素icon-default.png?t=N7T8https://leetcode.cn/problems/kth-largest-element-in-an-array/参考解法:

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int> pq(nums.begin(), nums.end());
        while (--k)
            pq.pop();
        return pq.top();
    }
};

        

4.3 模拟实现

template<class T>
class Less
{
public:
    bool operator()(const T& x, const T& y)
    {
        return x < y;
    }
};

template<class T>
class Greater
{
public:
    bool operator()(const T& x, const T& y)
    {
        return x > y;
    }
};
// class Less 和 class Greater 都是函数对象,具体知识参考后文


namespace my_pq
{
	template<class T, class Container = vector<T>, class Compare = Less<T>>
	class priority_queue
	{
	public:
		priority_queue()
		{}

		template <class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
			:_con(first, last)
		{
			for (int i = (_con.size() - 2) / 2; i >= 0; --i)
			{
				adjust_down(i);
			}
		}

		void adjust_up(int child)
		{
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				if (com(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

		void adjust_down(int parent)
		{
			size_t child = parent * 2 + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))
				{
					++child;
				}

				if (com(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}

		void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}

		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}

		const T& top()
		{
			return _con[0];
		}

		bool empty()
		{
			return _con.empty();
		}

		size_t size()
		{
			return _con.size();
		}
	private:
		Container _con;
        Compare com;
	};
}

效果演示:
        

        


五、仿函数/函数对象 

5.1 简要介绍        

        仿函数实际上并不是函数,只是使用起来与函数非常相似,故称为仿函数。本质上它是一个函数对象,我们通过一段代码来了解一下        

        借助模板和仿函数,我们就可以减少函数指针的使用,当然它也可以作为函数参数,为其它函数所用

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));        
        这样的函数指针谁也不喜欢用

我们还可以把仿函数用在其它类中,例如上面模拟实现的 priority_queue


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1062038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最全Python系列教程(非常详细)---Python中文乱码讲解(学Python入门必收藏)

&#x1f9e1;&#x1f9e1;&#x1f9e1;这篇是关于Python中为什么会出现中文乱码的讲解&#xff0c;欢迎点赞和收藏&#xff0c;你点赞和收藏是我更新的动力&#x1f9e1;&#x1f9e1;&#x1f9e1; 在解释Python中中文乱码的问题之前&#xff0c;我们先对计算机中几个基本…

物联网AI MicroPython传感器学习 之 手指侦测心跳传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 手指侦测心跳传感器是通过LED和光电晶体管监测手指血压脉冲&#xff0c;来判断人的心脏跳动。其结构简单成本低廉&#xff0c;只能是做一些实验和学习相关的知识&#xff08;没有医疗实用价值&…

C++11新特性(语法糖,新容器)

距离C11版本发布已经过去那么多年了&#xff0c;为什么还称为新特性呢&#xff1f;因为笔者前面探讨的内容&#xff0c;除了auto&#xff0c;范围for这些常用的&#xff0c;基本上是用着C98的内容&#xff0c;虽说C11已经发布很多年&#xff0c;却是目前被使用最广泛的版本。因…

string类的模拟实现(万字讲解超详细)

目录 前言 1.命名空间的使用 2.string的成员变量 3.构造函数 4.析构函数 5.拷贝构造 5.1 swap交换函数的实现 6.赋值运算符重载 7.迭代器部分 8.数据容量控制 8.1 size和capacity 8.2 empty 9.数据修改部分 9.1 push_back 9.2 append添加字符串 9.3 运算符重载…

Nacos与Eureka的区别

大家好我是苏麟今天说一说Nacos与Eureka的区别. Nacos Nacos的服务实例分为两种l类型&#xff1a; 临时实例&#xff1a;如果实例宕机超过一定时间&#xff0c;会从服务列表剔除&#xff0c;默认的类型。非临时实例&#xff1a;如果实例宕机&#xff0c;不会从服务列表剔除&…

Python安装指南:安装Python、配置Python环境(附安装包)

1. 选择正确的版本&#xff0c;下载安装包 根据你的实际需要选择Python发行版本。 值得注意的是&#xff0c;编程语言包并不是越新越好的&#xff0c;不同版本的Python之间可能会产生兼容性问题。 如果你不确定你的项目需要哪个版本&#xff0c;请查阅您可能需要使用到的插件的…

输入电压转化为电流性 5~20mA方案

输入电压转化为电流性 5~20mA方案 方案一方案二方案三 方案一 XTR111是一款精密的电压-电流转换器是最广泛应用之一。原因有二&#xff1a;一是线性度非常好、二是价格便宜。总结成一点&#xff0c;就是性价比高。 典型电路 最终电路 Z1二极管处输出电流表达式&#xff1a;…

(c语言进阶)数据存储——浮点型存储

一.常见的浮点数 二.浮点数存储规则 1.float存储规定 2.double存储规定 3.M的存储规则 4.E的存储规则 5.指数E从内存中取出的三种情况 &#xff08;1&#xff09;E不全为0或不全为1 &#xff08;2&#xff09;E全为0 &#xff08;3&#xff09;E全为1 三.举例 1.经典…

【高级rabbitmq】

文章目录 1. 消息丢失问题1.1 发送者消息丢失1.2 MQ消息丢失1.3 消费者消息丢失1.3.1 消费失败重试机制 总结 2. 死信交换机2.1 TTL 3. 惰性队列3.1 总结&#xff1a; 4. MQ集群 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1. 消息丢失问题 1.1…

Multi Label Classification with Missing Labels(MLML)的几种loss设计

多标签学习这个方向问题比较多&#xff0c;可以参考多标签学习的新趋势&#xff08;2021 Survey TPAMI&#xff09; 和 部分标签学习和缺失标签学习到底什么异同&#xff1f; 这两篇偏综述性质的解释。本文重点解释下面几个重点问题&#xff1a; Multi Label Classification w…

山西电力市场日前价格预测【2023-10-06】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-06&#xff09;山西电力市场全天平均日前电价为425.53元/MWh。其中&#xff0c;最高日前电价为777.87元/MWh&#xff0c;预计出现在18: 45。最低日前电价为328.89元/MWh&#xff0c;预计…

ICCV 2023 获奖论文公布,扩散模型、分割一切、跟踪一切摘得桂冠

昨天计算机视觉三大顶级会议之一的ICCV 2023在法国巴黎正式“开奖”了&#xff01;今年共有两篇论文获得最佳论文奖&#xff0c;大名鼎鼎的“分割一切”荣获最佳论文提名。 ICCV今年共收录了2160篇论文&#xff0c;从今年的录用论文的主题领域来看&#xff0c;3D视觉、图像视频…

大促节奏:速卖通黑五接力双十一,如何打造产品权重瓜分活动流量

双十一和黑五作为一种独特的消费文化现象&#xff0c;已经逐渐成为了消费领域中的一块“金字招牌”。无论是消费者还是商家&#xff0c;都非常期待这一天的到来&#xff0c;因为它不仅代表着购物的欲望和刺激&#xff0c;更重要的是&#xff0c;双十一和黑五已经成为了一种全新…

在springboot项目中整合Druid

或 1.导入maven坐标 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.19</version> </dependency>2.在application.properties中配置连接池 spring:datasource:d…

微信管理系统

在这个全民微信的时代&#xff0c;微信已成为生活和工作中不可缺少的工具&#xff0c;为了方便&#xff0c;大部分人都不会只有一个微信&#xff0c;很多企业老板和创业者都已经开始用微信管理系统来提升自身的业务效率和客户满意度。 微信管理系统适用哪些行业呢&#xff1f; …

SSM - Springboot - MyBatis-Plus 全栈体系(二十)

第四章 SpringMVC 二、SpringMVC 接收数据 3. 接收 Cookie 数据 可以使用 CookieValue 注释将 HTTP Cookie 的值绑定到控制器中的方法参数。 考虑使用以下 cookie 的请求&#xff1a; JSESSIONID415A4AC178C59DACE0B2C9CA727CDD84下面的示例演示如何获取 cookie 值&#x…

小谈设计模式(19)—备忘录模式

小谈设计模式&#xff08;19&#xff09;—备忘录模式 专栏介绍专栏地址专栏介绍 备忘录模式主要角色发起人&#xff08;Originator&#xff09;备忘录&#xff08;Memento&#xff09;管理者&#xff08;Caretaker&#xff09; 应用场景结构实现步骤Java程序实现首先&#xff…

如何使用 Media.io 生成不同年龄的照片

Media.io 是一个在线图片编辑器&#xff0c;提供多种功能&#xff0c;包括照片滤镜、图像裁剪和图像转换。其中&#xff0c;Media.io 的 AI 年龄转换功能可以根据上传的照片&#xff0c;生成不同年龄的照片。 使用 Media.io 生成不同年龄的照片 要使用 Media.io 生成不同年龄…

微信朋友圈还可以这么玩?

微信“朋友圈”除了日常了解好友动态外&#xff0c;就是时不时分享下自己的生活日常&#xff01; 但你知道吗&#xff0c;其实朋友圈还有许多有趣的玩法&#xff0c;只可惜只有“少数人”知晓&#xff01;一起来看看吧 01 关闭个性化“朋友圈”广告 微信作为我们生活的社交圈&…

try catch无法获取空指针异常的长度的问题

项目代码里有对异常进行捕获&#xff0c;然后根据异常的长度决定是否截取异常内容保存数据库的操作&#xff0c;然后对于空指针的异常是无法获取异常的长度的。 这个是获取空指针异常长度。 然后现在不获取异常的长度 解决方法&#xff1a;