【C++】30h速成C++从入门到精通(stack、queuepriority_queue以及deque介绍)

文章详细介绍了C++标准模板库(STL)中的stack、queue和priority_queue三种容器适配器,包括它们的底层容器、操作方法和使用场景。stack和queue通常基于deque实现,而priority_queue默认使用vector,支持大堆操作。同时,文章还提供了这三种数据结构的模拟实现示例,以及在实际问题如逆波兰表达式求值和最小栈中的应用。
摘要由CSDN通过智能技术生成

stack

stack的介绍

https://cplusplus.com/reference/stack/stack/?kw=stack

  1. stack是一种容器适配器,专门在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

  1. stack是作为容器适配器被实现的,容器适配器即是对特定类作为其底层的容器,并且提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素特定容器的尾部即栈顶被压入和弹出。

  1. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:

  • empty:判空操作

  • back:获取尾部元素操作

  • push_back:尾部插入元素操作

  • pop_back:尾部删除元素操作

  1. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有stack指定特定的底层容器,默认情况下使用deque

stack的使用

函数说明

接口说明

stack()

构造空的栈

empty()

检测stack是否为空

size()

返回stack中元素的个数

top()

返回栈顶元素的引用

push()

将元素vai踏入stack

pop()

将stack中尾部的元素弹出

最小栈:

class MinStack
{
public: 
 void push(int x)
 { 
 // 只要是压栈,先将元素保存到_elem中
 _elem.push(x);
 
 // 如果x小于_min中栈顶的元素,将x再压入_min中
 if(_min.empty() || x <= _min.top())
 _min.push(x);
 }
 
 void pop()
 {
 // 如果_min栈顶的元素等于出栈的元素,_min顶的元素要移除
 if(_min.top() == _elem.top())
 _min.pop();
 
 _elem.pop();
 }
 
 int top(){return _elem.top();}
 int getMin(){return _min.top();}
private:
 // 保存栈中的元素
 std::stack<int> _elem;
 
 // 保存栈的最小值
 std::stack<int> _min;
};

栈的弹出压入序列

class Solution {
public:
 bool IsPopOrder(vector<int> pushV,vector<int> popV) {
 //入栈和出栈的元素个数必须相同
 if(pushV.size() != popV.size())
 return false;
 
 // 用s来模拟入栈与出栈的过程
 int outIdx = 0;
 int inIdx = 0;
 stack<int> s;
 
 while(outIdx < popV.size())
 {
 // 如果s是空,或者栈顶元素与出栈的元素不相等,就入栈
 while(s.empty() || s.top() != popV[outIdx])
 {
 if(inIdx < pushV.size())
 s.push(pushV[inIdx++]);
 else
 return false;
 }
 
 // 栈顶元素与出栈的元素相等,出栈
 s.pop();
 outIdx++;
 }
 
 return true;
 }
};

逆波兰表达式求值

class Solution {
public:
 int evalRPN(vector<string>& tokens) {
 stack<int> s;
 for (size_t i = 0; i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值