栈和队列的概念

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

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

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

栈和队列操作

栈和队列基本操作

栈操作


栈中没有迭代器,因为不需要遍历元素。

最小栈

栈里面肯定有,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;}
};

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

  1. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

  2. Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...

  3. 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

    括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...

  4. 【Leetcode栈与队列】150. 逆波兰表达式求值(后缀表达式求值,看作对对碰游戏)

    文章目录 Leetcode150 1.问题描述 2.解决方案 3.计算机的思考方式 Leetcode150 1.问题描述 2.解决方案 1.逆波兰表达式优点 2.逆波兰表达式相当于是二叉树中的后序遍历 ...

  5. 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  6. leetcode 150. 逆波兰表达式求值(栈)

    根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达 ...

  7. c++栈的基础应用,括号匹配、逆波兰表达式求值

    //#include<iostream> //#include<string> //#include<iomanip> //#include<cstdlib& ...

  8. 《数据结构C语言版》——栈和队列详解(图文并茂),从零开始的学习

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  9. 栈和队列详解(C语言)

    栈和队列 栈 队列 力扣笔试题 栈 栈是什么,栈是一种数据存储的结构,采用的是先进后出,后进先出的原则,就好像是弹匣里的子弹,比如说一个弹匣有30发容量,那第一个发压进去的子弹肯定是最后一个射出的,最 ...

最新文章

  1. offset/client/scroll一些总结
  2. 怎样学好python-如何学好python——致python初学者的天梯
  3. 第一个dotnetcore程序,Hello World
  4. Redis学习笔记(4)-List
  5. AndroidStudio部署项目时出现错误:Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled
  6. Python数据类型知识点
  7. 调研Android的开发环境的发展演变
  8. 计算机学业水平考试答题卡,高一年级期末信息技术考试(含答题卡)
  9. oracle19c 安装权限_Oracle 数据库安装系列一:19C 软件安装和补丁升级
  10. 报错,atmSecondMenu.vue?bcc9:231 Uncaught (in promise) TypeError: Cannot read property ‘length‘ of null
  11. 微信小程序怎么确定是息屏、返回、还是Home键操作?
  12. AndroidUI 布局动画-为布局添加动画
  13. android4以上版本读写外置sd卡报错的解决办法
  14. Glance - 直接操作image
  15. 笔记本cpu温度高怎么办_夏天面团温度高怎么办?几个技巧让面温立马降下来
  16. Excel可视化图表模板,图表控的你快收藏呀!!!
  17. springboot 全局时间转换器
  18. 视频编解码学习:理论基础
  19. APP地推的一些经验
  20. python怎么应用在机械领域的国家砝码_2020尔雅通识课Python璇█搴旂敤答案获取...

热门文章

  1. mybatis 直接执行sql 【我】
  2. 小朋友排队|2014年蓝桥杯B组题解析第十题-fishers
  3. 【SQL】分组数据,过滤分组-group by , having
  4. mysql启动错误排查-无法申请足够内存
  5. web.xml 中的listener、 filter、servlet 加载顺序
  6. Building a RESTful Web Service
  7. idhttp.post方式 调用datasnap rest 远程方法
  8. 对c++primer 16.6.1的第4小节的代码说明
  9. [导入]Ajax使用初步
  10. mysql查询出过去一个月_Mysql查询今天、昨天、7天、近30天、本月、上一月 数据...