复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值
栈和队列的概念
栈:吃进去吐出来
对列:吃进去拉出来
数据结构中的栈和内存中的区别
数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性。
栈和队列操作
栈和队列基本操作
栈操作
栈中没有迭代器,因为不需要遍历元素。
最小栈
栈里面肯定有,push/pop/top操作,而且三个操作的时间复杂度是---->O(1)
我们要添加一个操作是 获取最小值的操作------>O(1)
对于一个普通的栈,要获取它的最小的元素,它的时间复杂度就不一定是O(1),因为只有把元素放在栈顶位置才能取
具体操作
第一种方法
用一个栈,一次性压入两个元素,比如我要压入2,此时栈空,那么这个2也就是栈中最小值,我们规定第一次压入的2代表栈中的数据,而第二次我们再把2压入代表栈中最小元素。
如果此时再来了一个数是1,那么我门先拿这个数与栈顶元素也就是栈中最小值进行比较,小,那么我们再压入两次1,两个1代表的意思跟上面的2一样
如果此时再来一个3,我们拿3与栈顶元素也就是栈中最小值进行比较,大,那么我们第一次压入栈中数据元素3,第二次压入1,也就是始终保持物理上的栈顶元素是最小的,但是理论上的栈顶元素是物理上的栈顶元素的下一个元素。
第二种方法
用两个栈,一个放数据,另外一个放最小值
最小栈实现
栈的弹出压入序列
给两个序列,一个是弹出的序列,另外一个是压入的序列,看看弹出序列是否匹配压入序列
- 入栈: 如果栈是空的或者栈顶元素不等于出栈序列的当前元素
- 出栈,如果栈顶元素等于出栈序列,出栈。
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;}
};
逆波兰表达式求值
必须用到栈
stack<int>s
;用来保存所遇到的数字依次取表达式种的每一项,
for (size_t i = 0; i < tokens.size(); ++i)
每一项是有可能是数字或者操作符,需要判断一下
if (!("+" == str || "-" == str || "*" == str || "/" == str))
如果是数字,每项都是字符串,所以需要
atoi
转化一下,再入栈s.push(atoi(str.c_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();
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;}
};
复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值相关推荐
- (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)
目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...
- Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...
- 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6
括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...
- 【Leetcode栈与队列】150. 逆波兰表达式求值(后缀表达式求值,看作对对碰游戏)
文章目录 Leetcode150 1.问题描述 2.解决方案 3.计算机的思考方式 Leetcode150 1.问题描述 2.解决方案 1.逆波兰表达式优点 2.逆波兰表达式相当于是二叉树中的后序遍历 ...
- 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- leetcode 150. 逆波兰表达式求值(栈)
根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达 ...
- c++栈的基础应用,括号匹配、逆波兰表达式求值
//#include<iostream> //#include<string> //#include<iomanip> //#include<cstdlib& ...
- 《数据结构C语言版》——栈和队列详解(图文并茂),从零开始的学习
哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...
- 栈和队列详解(C语言)
栈和队列 栈 队列 力扣笔试题 栈 栈是什么,栈是一种数据存储的结构,采用的是先进后出,后进先出的原则,就好像是弹匣里的子弹,比如说一个弹匣有30发容量,那第一个发压进去的子弹肯定是最后一个射出的,最 ...
最新文章
- offset/client/scroll一些总结
- 怎样学好python-如何学好python——致python初学者的天梯
- 第一个dotnetcore程序,Hello World
- Redis学习笔记(4)-List
- AndroidStudio部署项目时出现错误:Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled
- Python数据类型知识点
- 调研Android的开发环境的发展演变
- 计算机学业水平考试答题卡,高一年级期末信息技术考试(含答题卡)
- oracle19c 安装权限_Oracle 数据库安装系列一:19C 软件安装和补丁升级
- 报错,atmSecondMenu.vue?bcc9:231 Uncaught (in promise) TypeError: Cannot read property ‘length‘ of null
- 微信小程序怎么确定是息屏、返回、还是Home键操作?
- AndroidUI 布局动画-为布局添加动画
- android4以上版本读写外置sd卡报错的解决办法
- Glance - 直接操作image
- 笔记本cpu温度高怎么办_夏天面团温度高怎么办?几个技巧让面温立马降下来
- Excel可视化图表模板,图表控的你快收藏呀!!!
- springboot 全局时间转换器
- 视频编解码学习:理论基础
- APP地推的一些经验
- python怎么应用在机械领域的国家砝码_2020尔雅通识课Python璇█搴旂敤答案获取...
热门文章
- mybatis 直接执行sql 【我】
- 小朋友排队|2014年蓝桥杯B组题解析第十题-fishers
- 【SQL】分组数据,过滤分组-group by , having
- mysql启动错误排查-无法申请足够内存
- web.xml 中的listener、 filter、servlet 加载顺序
- Building a RESTful Web Service
- idhttp.post方式 调用datasnap rest 远程方法
- 对c++primer 16.6.1的第4小节的代码说明
- [导入]Ajax使用初步
- mysql查询出过去一个月_Mysql查询今天、昨天、7天、近30天、本月、上一月 数据...