C++stackqueue

2023-10-06 02:50
文章标签 c++ stackqueue

本文主要是介绍C++stackqueue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、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>>    // 复用dequeclass 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


这篇关于C++stackqueue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152663

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取