复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值

栈和队列的概念

栈:吃进去吐出来
对列:吃进去拉出来

数据结构中的栈和内存中的区别

数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性。

栈和队列操作

栈和队列基本操作

栈操作

在这里插入图片描述
栈中没有迭代器,因为不需要遍历元素。

最小栈

栈里面肯定有,push/pop/top操作,而且三个操作的时间复杂度是---->O(1)
我们要添加一个操作是 获取最小值的操作------>O(1)
对于一个普通的栈,要获取它的最小的元素,它的时间复杂度就不一定是O(1),因为只有把元素放在栈顶位置才能取

具体操作

第一种方法

用一个栈,一次性压入两个元素,比如我要压入2,此时栈空,那么这个2也就是栈中最小值,我们规定第一次压入的2代表栈中的数据,而第二次我们再把2压入代表栈中最小元素。
如果此时再来了一个数是1,那么我门先拿这个数与栈顶元素也就是栈中最小值进行比较,小,那么我们再压入两次1,两个1代表的意思跟上面的2一样
如果此时再来一个3,我们拿3与栈顶元素也就是栈中最小值进行比较,大,那么我们第一次压入栈中数据元素3,第二次压入1,也就是始终保持物理上的栈顶元素是最小的,但是理论上的栈顶元素是物理上的栈顶元素的下一个元素。
在这里插入图片描述
在这里插入图片描述

第二种方法

用两个栈,一个放数据,另外一个放最小值
在这里插入图片描述

最小栈实现

栈的弹出压入序列

给两个序列,一个是弹出的序列,另外一个是压入的序列,看看弹出序列是否匹配压入序列

  1. 入栈: 如果栈是空的或者栈顶元素不等于出栈序列的当前元素
  2. 出栈,如果栈顶元素等于出栈序列,出栈。
class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {//入栈序列和出栈序列的个数都不一样,那么肯定不匹配if(pushV.size() != popV.size())return false;stack<int>s;size_t inIdx=0;     //标记入栈元素size_t outIdx=0;    //标记待出栈元素while(outIdx < popV.size()){while(s.empty()|| s.top() != popV[outIdx]){if(inIdx < pushV.size())s.push(pushV[inIdx++]);elsereturn false ;}s.pop();++outIdx;}return true;}
};

逆波兰表达式求值

在这里插入图片描述

  1. 必须用到栈 stack<int>s;用来保存所遇到的数字

  2. 依次取表达式种的每一项,for (size_t i = 0; i < tokens.size(); ++i)

  3. 每一项是有可能是数字或者操作符,需要判断一下if (!("+" == str || "-" == str || "*" == str || "/" == str))

  4. 如果是数字,每项都是字符串,所以需要atoi转化一下,再入栈s.push(atoi(str.c_str()));

  5. 取操作符,到栈中取当前操作符的左右操作数

    int right = s.top();
    s.pop();
    int left = s.top();
    s.pop();
    
  6. 选择是什么类型的运算,并进行元素后再次入栈

    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;
    }
    
  7. 结果就在栈顶位置,return s.top();

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> s;for (size_t i = 0; i < tokens.size(); ++i){string& str = tokens[i];if (!("+" == str || "-" == str || "*" == str || "/" == str)){//数字s.push(atoi(str.c_str()));}else{//操作符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'/':s.push(left / right);break;}}}return s.top();}
};

队列操作

在这里插入图片描述

二叉树层序遍历

在这里插入图片描述

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*///用来表示队列中存放的数据类型struct levelNode{int level;TreeNode *root;};
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>ret;if(root==NULL){return ret;}queue<TreeNode*> q;q.push(root);   //已经将第一层的所有结点放到队列种while(!q.empty()){//一次型将s一层的所有结点遍历完vector<int > level;int levelSize =q.size();for(size_t i = 0; i< levelSize;++i){TreeNode * pCur =q.front();level.push_back(pCur->val);//如果该结点有左右子树if(pCur->left)q.push(pCur->left);if(pCur->right)q.push(pCur->right);q.pop();}ret.push_back(level);}return ret;}
};

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

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

相关文章

CentOS7关闭防火墙

firewalld的基本使用 启动 systemctl start firewalld关闭 systemctl stop firewalld查看状态 systemctl status firewalld 开机禁用 systemctl disable firewalld开机启用 systemctl enable firewalldCentOS 7的服务管理 启动一个服务 systemctl start firewalld.service关闭…

详解优先级队列priority_queue(应用+模拟实现)

优先级队列的概念 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且只能检索最大堆元素(优先队列中位于顶部的元 素)。优先队列被实现为容…

c++中容器适配器

什么是容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff0c;该中模式是将一个类的接口转换成客户希望的另外一个接口。 stack模拟封装 template<class T,class Container deque<T>>cl…

模拟实现priority_queue优先级队列

优先级队列 无参构造 priority_queue():c(){}区间构造 区间构造需要用到迭代器&#xff0c;而迭代器每个容器的类型不一样&#xff0c;所以用模板给出&#xff0c;初始化列表&#xff0c;把用户给进来的元素空间起始位置&#xff0c;放到优先级队列中底层空间的位置&#xf…

详解malloc,calloc,realloc原理及其模拟实现

malloc原理 malloc它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时&#xff0c;它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后&#xff0c;将该内存块一分为二&#xff08;一块的大小与用户请求的大小相等&#xff0c;另一块的大…

c++动态内存管理题目

malloc/free和new/delete的区别 malloc/free和new/delete的共同点是&#xff1a;都是从堆上申请空间&#xff0c;并且需要用户手动释放。不同的地方是&#xff1a; malloc和free是函数&#xff0c;new和delete是操作符malloc申请的空间不会初始化&#xff0c;new可以初始化ma…

私人博客定制----封装数据库接口

封装MySQLAPI 我们先把初始化句柄和断开句柄进行一个封装 static MYSQL* MySQLInit(){ //1.初始化一个Mysql句柄建立连接 MYSQL* connect_fd mysql_init(NULL); //2.和数据库建立连接 if (mysql_real_connect(connect_fd, "127.0.0.1", "root&quo…

私人博客定制---服务器接口封装

实现服务器接口 我们用一个http服务器作为底层&#xff0c;但是c中并没有先成的http服务器&#xff0c;所以我在GitHub上找到一个牛人写的http服务器&#xff0c;拿来直接用&#xff0c;节省本项目开发的时间 这是服务器的链接地址 上面有详细的使用方法&#xff0c;本文就不再…

私人博客定制

项目背景 可行性方面 需求分析&#xff1a; 详细设计&#xff1a; 数据库设计 博客管理API的设计 标签相关API 服务器端的实现 对数据库操作进行封装 对服务器操作进行封装 客户端实现 具体操作 使用markdown 具体实现 测试 项目效果展示 维护 完整代码 项目…

初识c++中的函数模板

函数模板 函数模板概念 函数模板:编译器生成代码的一个规则。函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型产生函数的特定类型版本。 函数模板格式 //要让这个函数与类型无关 //Add函数模板 template…

深入理解c++中的函数模板

非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使…

c++中的IO流

c语言中的IO操作 标准类型的输入输出: 输入------>数据来源是通过键盘进行输入输出------>程序中的数据输出到控制台 c语言中: scanf:输入 printf:输出 两个函数的相同点 1 —格式串 2 —不定参数 两个函数的缺陷 1 —用户要提供数据的格式—用户要记忆大量的格式串—…

201301 JAVA2~3级---走格子

请编写一个函数&#xff08;允许增加子函数&#xff09;&#xff0c;计算n x m的棋盘格子&#xff08;n为横向的格子数&#xff0c;m为竖向的格子数&#xff09;沿着各自边缘线从左上角走到右下角&#xff0c;总共有多少种走法&#xff0c;要求不能走回头路&#xff0c;即&…

复习Linux基本操作----常见指令

Linux基本操作 ls命令 ls(list):相当于windows上的文件资源管理器 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目…

复习Linux基础操作---权限操作

shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与kernel沟…

【剑指offer】_01 (二维数组中的查找)

题目描述 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该…

【剑指offer】_02替换空格

题目描述 请实现一个函数&#xff0c;将一个字符串中的每个空格替换成“%20”。例如&#xff0c;当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解题思路 首先我们先算出整个字符串的长度&#xff0c;还有总共多少个空格。因为空格只占一个字节&#…

【剑指offer】_04 重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建二叉树并返回。 解题思路 用前序的顺序…

再谈c++中的多态

何为多态 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 多态的实现 在继承的体系下 基类中必须有虚函数(被virtual关键字修饰的成员函数)&#xff0c;在派生类中必须…

再谈c++中的继承

继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体现了…