当前位置: 首页 > news >正文

STL-stack/queue/deque(容器适配器)

 

目录

​编辑

STL-stack

150. 逆波兰表达式求值

stack

queue

std::stack

deque

性能测试

结构


STL-stack

栈的压入、弹出序列_牛客题霸_牛客网输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假。题目来自【牛客题霸】icon-default.png?t=O83Ahttps://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&&tqId=11174&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// write code herestack<int> st;int pushi=0,popi=0;while(pushi<pushV.size()){st.push(pushV[pushi]);pushi++;while(!st.empty()&&st.top()==popV[popi]){st.pop();popi++;}}return st.empty();}

双层while循环

150. 逆波兰表达式求值

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/evaluate-reverse-polish-notation/description/

 int evalRPN(vector<string>& tokens) {stack<int> st;for(auto str:tokens){if(str=="+"||str=="-"||str=="*"||str=="/"){int right=st.top();st.pop();int left=st.top();st.pop();switch(str[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;}}else{st.push(stoi(str));}}return st.top();}

stack

template<class T,class Container>
class stack
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}T& top(){return _con.back();}
private:Container _con;
};
stack<int, vector<int>> st;
st.push(1);
st.push(2);
st.push(3);
while (!st.empty())
{cout << st.top() << " ";st.pop();
}

queue

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

不能用vector,vector不支持头删(效率太低)。只能支持list

总结:

stl中的stack和queue是通过容器适配器转换出来的,不是原生实现的->提高代码的复用性。

class template

<stack>

std::stack

template <class T, class Container = deque<T> > class stack;

class Container = deque<T>双端队列。

deque

支持任意位置插入和随机访问。

性能测试

void test_deque()
{deque<int> d;vector<int> v;const int n = 10000;srand(time(0));for (size_t i = 0; i < n; ++i){int x = rand();d.push_back(x);v.push_back(x);}size_t begin1 = clock();sort(d.begin(), d.end());size_t end1 = clock();size_t begin2 = clock();sort(v.begin(), v.end());size_t end2 = clock();cout << end1 - begin1 << endl;cout << end2 - begin2 << endl;
}

结构

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维 数组,其底层结构如下图所示:

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落 在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:

http://www.lryc.cn/news/435447.html

相关文章:

  • NVDLA专题15:Runtime environment-核心模式驱动
  • 计算机毕业设计选题推荐-班级管理系统-教务管理系统-Java/Python项目实战
  • 推荐一款开源、高效、灵活的Redis桌面管理工具:Tiny RDM!支持调试与分析功能!
  • Java项目: 基于SpringBoot+mybatis+maven新闻推荐系统(含源码+数据库+毕业论文)
  • 《Python读取 Excel 数据》
  • Druid连接池
  • Python3网络爬虫开发实战(14)资讯类页面智能解析
  • 社交媒体的未来:Facebook如何通过AI技术引领潮流
  • Java 面试题:从源码理解 ThreadLocal 如何解决内存泄漏 ConcurrentHashMap 如何保证并发安全 --xunznux
  • 使用人力劳务灵工安全高效的发薪工具
  • 使用W外链创建微信短链接的方法
  • 【人工智能学习笔记】4_4 深度学习基础之生成对抗网络
  • 基于MinerU的PDF解析API
  • 猫头虎分享:看完百度内部讲话,整理出李彦宏关于大模型的10个判断
  • vue3透传、注入
  • 数模原理精解【9】
  • Java中的linkedList类及与ArrayList的异同
  • 【精选】文件摆渡系统:跨网文件传输的安全与效率之选
  • tkinter 电子时钟 实现时间日期 可实现透明 无标题栏
  • 【hot100-java】【除自身以外数组的乘积】
  • 【Python机器学习】循环神经网络(RNN)——审察模型内部情况
  • 智能语音交互:人工智能如何改变我们的沟通方式?
  • vue3中动态引入本地图片的两种方法
  • Linux网络——socket编程与UDP实现服务器与客户机通信
  • 大型语言模型中推理链的演绎验证
  • openharmony 应用支持常驻和自启动
  • Winform中引入WPF控件后键盘输入无响应
  • 多线程——死锁
  • 链路追踪可视化利器之火焰图
  • C语言 ——— 条件编译指令实际用途