【C++】stack(STL)

stack的介绍

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
  3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
    empty:判空操作
    back:获取尾部元素操作
    push_back:尾部插入元素操作
    pop_back:尾部删除元素操作
  4. 标准容器vectordequelist均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque

stack的使用

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

最小栈

cpp 复制代码
#include <iostream>
#include <stack>

class MinStack {
public:
    MinStack() {}

    void push(int x) {
        _elem.push(x);
        if (_min.empty() || x <= _min.top())
            _min.push(x);
    }

    void pop() {
        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;
};

栈的压入弹出序列

cpp 复制代码
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;
 }
};

逆波兰式求值

cpp 复制代码
class Solution {
public:
 int evalRPN(vector<string>& tokens) 
 {
	 stack<int> s;
	 
	 for (size_t i = 0; i < tokens.size(); ++i)
	 {
		 string& str = tokens[i];
		 // str为数字
		 if (!("+" == str || "-" == str || "*" == str || "/" == str))
		 {
		 	s.push(atoi(str.c_str()));
		 }
		 else
		 {
			 // str为操作符
			 int right = s.top();
			 s.pop();
			 
			 int left = s.top();
			 s.pop();
			 
			 switch (str[0])
			 {
				 case '+':
					 s.push(left + right);
					 break;
					 
				 case '-':
					 s.push(left - right);
					 break;
				 
				 case '*':
					 s.push(left * right);
					 break;
				 
				 case '/':
					 // 题目说明了不存在除数为0的情况
					 s.push(left / right);
					 break;
			 }
		 }
	 }
 return s.top();
 }
};
相关推荐
是Yu欸2 分钟前
【仓颉语言】原生智能、全场景与强安全的设计哲学
开发语言·安全·鸿蒙·鸿蒙系统·仓颉语言
Source.Liu5 分钟前
【CMakeLists.txt】CMake 编译定义带值参数详解
c++·qt·librecad
杨福瑞5 分钟前
数据结构:顺序表讲解(1)
c语言·开发语言·数据结构
知花实央l12 分钟前
【数字逻辑】数字逻辑实验实战:74HC151实现逻辑函数+74HC138搭全加器(附接线步骤+避坑指南)
算法·容器·测试用例·逻辑回归
CoovallyAIHub14 分钟前
突破性开源模型DepthLM问世:视觉语言模型首次实现精准三维空间理解
深度学习·算法·计算机视觉
研究司马懿16 分钟前
【GitOps】Argo CD app of apps
大数据·开发语言·elasticsearch·搜索引擎·云原生·argocd·gitops
程序猿编码20 分钟前
轻量级却实用:sigtrace 如何靠 ptrace 实现 Linux 信号的捕获与阻断(C/C++代码实现)
linux·c语言·c++·信号·捕获·ptrace
曦樂~23 分钟前
【Qt】TCP连接--客户端和服务器
服务器·网络·c++·qt·tcp/ip
WoodWall27 分钟前
WebServer 02 Reactor模式
c++·后端
WaWaJie_Ngen31 分钟前
【OpenGL】模板测试(StencilTest)
c++·算法·游戏·游戏引擎·游戏程序·图形渲染