【C++】适配器stack/queue/priority_queue使用和实现

news2024/10/10 12:39:41

目录

容器适配器 

什么是容器适配器 

​编辑stack

stack的了解和使用 

使用举例 

题目加深 

模拟实现 

功能实现 

测试文件 

​编辑queue 

queue的了解和使用 

 使用举例

 题目加深

 模拟实现

功能实现

 测试文件

 priority_queue

priority_queue的了解和使用 

使用举例

题目加深

模拟实现 

 功能实现

 测试文件


容器适配器 

什么是容器适配器 

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。

stack

stack的了解和使用 

 

函数说明接口说明
stack()构造栈
empty()检测stack是否为空
size()返回stack中有效元素的个数
top()返回栈顶元素的引用
push()将元素val压入stack中
pop()将元素弹出stack中

使用举例 

int main()
{
	// 默认展开std
	// stack
	// 构造方面
	stack<int> st;  // 空栈
	st.push(1);  // 栈顶插入
	st.push(2); 
	st.push(3); 
	st.push(4); 
	st.push(5);
	while (!st.empty())
	{
		cout << st.top() << " ";
		cout << "size:" << st.size() << endl;
		st.pop();
	}

	return 0;
}

题目加深 

155. 最小栈 - 力扣(LeetCode)

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {
        // 如果最小栈为空或者val元素小于等于最小栈的栈顶元素,则插入最小栈
        // 注意:等于时也要插入,防止正常栈删除时最小栈的元素未删除的情况
        if(_minst.size() == 0 || val <= _minst.top())
        {
            _minst.push(val);
        }
        _st.push(val);
    }
    
    void pop() {
        // 如果栈顶元素相同都要删除
        if(_st.top() == _minst.top())
        {
            _minst.pop();
        }
        _st.pop();
    }
    
    int top() {
        return _st.top();
    }
    
    int getMin() {
        return _minst.top();
    }
private:
    stack<int> _st;     // 正常栈
    stack<int> _minst;  // 最小栈
};

栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pushV int整型vector 
     * @param popV int整型vector 
     * @return bool布尔型
     */
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        // write code here
        stack<int> st;
        int i = 0;
        for(auto& e : pushV)
        {
            st.push(e);
            while(!st.empty() && st.top() == popV[i])
            {
                st.pop();
                ++i;
            }
        }
        return st.empty();
    }
};

 150. 逆波兰表达式求值 - 力扣(LeetCode)

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(size_t i = 0; i < tokens.size(); ++i)
        {
            string& in = tokens[i];
            if(!(in == "+" || in == "-" || in == "*" || in == "/"))
            {
                st.push(atoi(in.c_str()));
            }
            else{
                int right = st.top();
                st.pop();
                int left = st.top();
                st.pop();
                switch(in[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;                   
                }             
            }
        }
        return st.top();
    }
};

模拟实现 

功能实现 

template<class T>
class Stack
{
public:
	void push(const T& val) { _v.push_back(val); }
	void pop() { _v.pop_back(); }
	size_t size(){ return _v.size(); }
	bool empty() { return _v.empty(); }
	const T& top() const { return _v.back(); }
	T& top() { return _v.back(); }
private:
	vector<T> _v;
};

测试文件 

int main()
{
	ouyang::Stack<int> st;
	st.push(1);  
	st.push(2);
	st.push(3);
	st.push(4);
	st.push(5);
	while (!st.empty())
	{
		cout << st.top() << " ";
		cout << "size:" << st.size() << endl;
		st.pop();
	}
	return 0;
}

queue 

queue的了解和使用 

函数声明接口说明
queue()构造空队列
empty()检测队列是否为空
size()返回队列中有效元素个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val插入
pop()将队头元素出队列

 使用举例

int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	q.push(5);
	while (!q.empty())
	{
		cout << "front" << q.front() << " ";
		cout << "back" << q.back() << " ";
		cout << "size" << q.size() << " ";
		q.pop();
		cout << endl;
	}
	return 0;
}

 题目加深

225. 用队列实现栈 - 力扣(LeetCode)

class MyStack {
public:
    MyStack() {}

    void push(int x) { 
        _q1.push(x); 
        }

    int pop() {
        int num = 0;
        if (!_q1.empty()) {
            while (_q1.size() > 1) {
                _q2.push(_q1.front());
                _q1.pop();
            }
            num = _q1.front();
            _q1.pop();
        }
        else{
            while (_q2.size() > 1) {
                _q1.push(_q2.front());
                _q2.pop();
            }
            num = _q2.front();
            _q2.pop();
        }
        return num;
    }

    int top() {
        if (!_q1.empty()) {
            return _q1.back();
        } else {
            return _q2.back();
        }
    }

    bool empty() { 
        return _q1.empty() && _q2.empty(); 
        }

private:
    queue<int> _q1;
    queue<int> _q2;
};

 模拟实现

功能实现

template<class T>
class Queue
{
public:
	void push(const T& val) { _ls.push_back(val); }
	void pop() { _ls.pop_front(); }
	size_t size() const { return _ls.size(); }
	bool empty() const { return _ls.empty(); }
	T& front() { return _ls.front(); }
	const T& front() const { return _ls.front(); }
	T& back() { return _ls.back(); }
	const T& back() const { return _ls.back(); }
private:
	list<T> _ls;
};

 测试文件

int main()
{
	ouyang::Queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	q.push(5);
	while (!q.empty())
	{
		cout << "front" << q.front() << " ";
		cout << "back" << q.back() << " ";
		cout << "size" << q.size() << " ";
		q.pop();
		cout << endl;
	}
	return 0;
}

 priority_queue

priority_queue的了解和使用 

函数声明接口说明
priority_queue() / priority_queue(first, last)

构造一个空的优先级队列(堆)

使用迭代器构造一个优先级队列(堆)

empty()检测优先级队列(堆)是否为空
top()返回优先级队列中最大(最小)的元素引用,即堆顶元素
push(x)在优先级队列(堆)中插入元素x
pop()删除优先级队列中最大(最小)的元素引用,即堆顶元素

使用举例

int main()
{
	// 默认情况下,创建的是大堆,其底层按照小于号比较
	vector<int> v{ 3,2,7,6,0,4,1,9,8,5 };
	priority_queue<int> q1;
	for (auto& e : v)
		q1.push(e);
	cout << q1.top() << endl;
	// 如果要创建小堆,将第三个模板参数换成greater比较方式
	priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
	cout << q2.top() << endl;
	return 0;
}

题目加深

215. 数组中的第K个最大元素 - 力扣(LeetCode)

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int> pq(nums.begin(), nums.end());
        for(int i = 0; i < k-1; ++i)
        {
            pq.pop();
        }
        return pq.top();
    }
};

模拟实现 

 功能实现

template<class T>
struct less
{
	bool operator()(const T& left, const T& right)
	{
		return left < right;
	}
};

template<class T>
struct greater
{
	bool operator()(const T& left, const T& right)
	{
		return left > right;
	}
};

template<class T, class Container = std::vector<T>, class Compare = less<T>>
class Priority_queue
{
public:
	Priority_queue() :_c() {};

	template<class Iterator>
	Priority_queue(Iterator first, Iterator last)
		:_c(first, last)
	{
		int root = (_c.size() - 2) >> 1;
		for (; root >= 0; --root)
		{
			AdjustDown(root);
		}
	}

	void push(const T& val)
	{
		_c.push_back(val);
		AdjustUp(_c.size() - 1);
	}

	void pop()
	{
		if (empty())
			return;
		swap(_c.front(), _c.back());
		_c.pop_back();
		AdjustDown(0);
	}

	size_t size() const { return _c.size(); }
	bool empty() const { return _c.empty(); }

	const T& top() const { return _c.front(); }

private:
	void AdjustUp(int child)
	{
		int parent = (child - 1) >> 1;
		while (child)
		{
			if (Compare()(_c[parent], _c[child]))
			{
				swap(_c[parent], _c[child]);
				child = parent;
				parent = (child - 1) >> 1;
			}
			else {
				break;
			}
		}
	}

	void AdjustDown(int parent)
	{
		int child = parent * 2 + 1;
		while (child < _c.size())
		{
			if (child + 1 < _c.size() && Compare()(_c[child], _c[child + 1]))
			{
				child += 1;
			}
			if (Compare()(_c[parent], _c[child]))
			{
				swap(_c[parent], _c[child]);
				parent = child;
				child = parent * 2 + 1;
			}
			else {
				break;
			}
		}
	}

	Container _c;
};

 测试文件

int main()
{
	// 默认情况下,创建的是大堆,其底层按照小于号比较
	vector<int> v{ 3,2,7,6,0,4,1,9,8,5 };
	ouyang::Priority_queue<int> q1;
	for (auto& e : v)
		q1.push(e);
	cout << q1.top() << endl;

	 如果要创建小堆,将第三个模板参数换成greater比较方式
	ouyang::Priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
	cout << q2.top() << endl;
	return 0;
}

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

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

相关文章

基于SpringBoot项目评审系统【附源码】

基于SpringBoot项目评审系统 效果如下&#xff1a; 系统首页界面 学生登录界面 项目信息页面 项目申报页面 专家注册界面 管理员登录界面 管理员功能界面 项目评审界面 评审结果界面 研究背景 在当今快速发展的信息时代&#xff0c;项目评审作为项目管理的关键环节&#xff…

【网络】初识https协议加密过程

初识https协议加密过程 为什么不用http而要使用https常见的加密方式对称加密非对称加密数据摘要&&数据指纹 https的工作过程探究方案一&#xff1a;只使用对称加密方案二&#xff1a;只使用非对称加密方案三&#xff1a;双方都使用对称加密方案四&#xff1a;非对称加密…

毕设分享 基于协同过滤的电影推荐系统

文章目录 0 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

四、Java 概念知识简单了解

一、Java 的类、对象、方法和实例变量 一个 Java 程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象&#xff1a;对象是类的一个实例&#xff0c;有状态&#xff08;实例变量&#xff…

嵌入式面试——FreeRTOS篇(三) 消息队列和队列集

本篇为&#xff1a;消息队列和队列集篇 消息队列 1、FreeRTOS中的消息队列是什么 答&#xff1a; 消息队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)。 2、消息队列和全局变量的区别 答&#xff1a; 消息队列作用有点类似于全局变量&#xff0c;但消…

简单的网络爬虫爬取视频

示例代码爬取一个周杰伦相关视频 import requests# 自己想下载的视频链接 video_url https://vdept3.bdstatic.com/mda-qg8cnf4bw5x6bjs5/cae_h264/1720516251158906693/mda-qg8cnf4bw5x6bjs5.mp4?v_from_shkapp-haokan-hbf&auth_key1728497433-0-0-4a32e13f751e04754e4…

谷歌上架,应用明明没问题,咋就成了“恶意软件”?看看可能的原因

作为Google Play上架应用的开发者&#xff0c;大家的普遍感受&#xff1a;比起写代码&#xff0c;上架的过程简直更让人心力交瘁&#xff01;特别是涉及用户数据和隐私保护的时候&#xff0c;稍有疏忽&#xff0c;就可能面临应用被下架、甚至账号被封的风险。 最近听到很多开发…

6.存储过程中的游标使用(6/10)

存储过程中的游标使用 引言 在数据库编程中&#xff0c;游标&#xff08;Cursor&#xff09;是一种重要的数据库对象&#xff0c;它允许开发者逐行处理查询结果集。这对于需要对每一行数据进行特定处理的场景非常有用&#xff0c;如数据转换、数据清洗、复杂计算等。本文将详…

Qt 与 GTK:跨平台 GUI 开发利器,可用Python助力高效GUI编程

在现代软件开发中&#xff0c;图形用户界面 (GUI) 至关重要&#xff0c;它直接影响用户体验和软件的易用性。Qt 和 GTK 作为两种主流的跨平台 GUI 库&#xff0c;为开发者提供了构建精美且功能强大的应用程序的强大工具。本文将深入介绍 Qt 和 GTK 的特性&#xff0c;并探讨如何…

SwiftUI 6.0(iOS 18)新增的网格渐变色 MeshGradient 解惑

概述 在 SwiftUI 中&#xff0c;我们可以借助渐变色&#xff08;Gradient&#xff09;来实现更加灵动多彩的着色效果。从 SwiftUI 6.0 开始&#xff0c;苹果增加了全新的网格渐变色让我们对其有了更自由的定制度。 因为 gif 格式图片自身的显示能力有限&#xff0c;所以上面的…

springboot网站开发-mysql数据库字段varchar类型存储汉字的长度关系

springboot网站开发-mysql数据库字段varchar类型存储汉字的长度关系&#xff01; 如果你的数据表是utf-8编码&#xff0c;并且采用的是mysql数据库。设计自己的业务数据。那么&#xff0c;如果你采用是varchar类型的字段格式&#xff0c;一个汉字就是一个字节。 如图所示&#…

zookeeper API使用——znode的CRUD

这应该是目录 一、创建连接1.1构造函数1.2创建连接(封装) 二、节点操作2.1创建节点create语法代码 2.2获取节点数据getData语法代码 2.3获取子节点getChildren语法代码 2.4修改节点的值setData语法代码 2.5删除delete语法代码 以下的代码只能作为基础的语法使用&#xff0c;为了…

带隙基准Bandgap电路学习(二)

一、高低温性能测试 设置仿真环境温度为-40℃ &#xff0c;观察电路管子工作状态是否正确 环路相位裕度为53.1853 输出噪声曲线&#xff1a; 电源抑制PSR曲线&#xff1a; 设置仿真环境温度为85℃ &#xff0c;观察电路管子工作状态是否正确 环路相位裕度为53.7297 输出噪…

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间&#xff0c;现在&#xff0c;Win 11的24H2版本终于等到了&#xff0c;微软已经全面公开发布Win11 24H2版本&#xff0c;版本号为26100.1742&#xff0c;此次官宣的版本包括了消费者版、商业版、LTSC 2024版等&#xff0c;各种语言版本…

旅游景区小程序|提供多元化服务,打造一站式旅游体验

今年国庆黄金周&#xff0c;各地精心筹备&#xff0c;打造了丰富多彩的文化旅游盛宴&#xff0c;吸引了来自四面八方的游客。凭借各地的自然风光、丰富的人文景观以及精彩纷呈的旅游活动&#xff0c;吸引众多游客。此次国庆旅游市场的火爆&#xff0c;不仅为当地带来了可观的经…

C语言预处理详解(上)(30)

文章目录 前言一、预定义符号二、#define定义标识符三、#define定义宏四、#define的替换规则五、带有副作用的宏六、宏和函数的对比七、#undef的作用八、# 和#的作用##的作用 总结 前言 C语言的入门学习差不多要到尾声了&#xff0c;感觉如何呢~   前文说编译的第一步就是预编…

ax1.twinx()函数介绍

目录 ax1.twinx()实战 ax1.twinx() ax1.twinx() 是 Matplotlib 中用于创建共享 x 轴的双 y 轴的函数。在 Matplotlib 中&#xff0c;当我们希望在同一图中显示不同的数据集&#xff0c;但它们具有相同的 x 轴数据时&#xff0c;可以使用 twinx() 函数创建一个新的坐标轴&#…

(五)、CT球管

第一代和第二代扫描仪使用固定阳极、油冷的X射线管&#xff0c;但由于对输出功率增加的需求&#xff0c;旋转阴极X射线管在CT中变得普遍。 传统固定阳极CT管&#xff0c;当阴极钨丝通过足够的电流时&#xff0c;使其产生白热现象时电子会从钨的表面逸出形成电子云&#xff0c;通…

Lazada菲律宾本土店选品怎么操作?EasyBoss ERP选品功能来帮你!

由于Lazada本土店在流量、履约速度、类目限制以及回款速度方面的优势&#xff0c;越来越多的Lazada卖家都在考虑转型做本土店&#xff0c;但本土化落地并不是一件容易的事&#xff0c;很多卖家在选品阶段就踩大坑了。 因此&#xff0c;为了选品不踩坑&#xff0c;很多卖家都会…

阿里云物联网自有app创建之初始化SDK

文章目录 一、新建工程&#xff0c;配置gradle,导入.so文件&#xff0c;生成apk二、上传apk&#xff0c;集成安全图片&#xff0c;下载SDK三、SDK的集成四、初始化SDK 最近在研究阿里云自有app,这是自己的心得。 一、新建工程&#xff0c;配置gradle,导入.so文件&#xff0c;生…