面试经典150题 -- 栈(总结)

总的链接

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

关于栈 -- stack 的学习链接

c++的STL中的栈 -- stack-CSDN博客

20 . 有效的括号

这题直接用栈模拟就好了;

这里用一种取巧的方法 , 当遇见左括号,加入右括号,遇到右括号,直接判断栈顶元素是不是与当前元素相等(这样可以避免再开一个哈希表来存相应括号之间的映射关系),相等的话,pop栈顶,否则,直接return false;

class Solution {
public:bool isValid(string s) {stack<char> st ;for(char c : s){if(c=='(') st.push(')');else if(c=='[') st.push(']');else if(c=='{') st.push('}');else if(st.empty() || st.top()!=c) return false;else st.pop();}return st.empty() ;}
};

71 . 简化路径

先求出夹在两个/之间的目录名,根据题意,对于空或" . "都不用管,然后用栈模拟,如果不是"..",那么直接入栈,是".."的话,弹出栈顶的字符串;

class Solution {
public:vector<string> get(string p,char ch){vector<string> ans ;string cur ;for(char c : p){if(c == ch){ans.push_back(cur);cur.clear();}else{cur += c ;}}ans.push_back(cur);return ans ;}string simplifyPath(string path) {vector<string> p = get(path,'/');vector<string> stk ;for(string s : p){if(s==".."){if(!stk.empty())stk.pop_back();}else if(!s.empty() && s!="."){stk.push_back(s);}}string ans  ;if(stk.empty()){ans = "/";}else{for(string s : stk){ans += "/" + s ;}}return ans ;}
};

155 . 最小栈

用一个栈来模拟正常的操作,用一个递减的栈来维护栈顶为当前序列的最小元素;

详情请看代码 : 

class MinStack {
public:stack<int> mi,st;MinStack() {mi.push(INT_MAX) ;}void push(int val) {st.push(val) ;mi.push(min(val,mi.top()));}void pop() {st.pop();mi.pop();}int top() {return st.top() ;}int getMin() {return mi.top() ;}
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

150 . 逆波兰表达式求值

栈的典型例题,如果是运算符,就取出栈顶两位元素进行运算,然后将结果压入栈中,如果是数字,直接压入栈中,最后返回栈顶元素即为运算结果 ;

typedef long long LL ;
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<LL> st ;for(string s : tokens){if(s=="+" ||s=="-" ||s=="*" ||s=="/"){LL x = st.top();st.pop() ;LL y = st.top();st.pop();if(s=="+") st.push(x+y);else if(s=="-") st.push(y-x);else if(s=="*") st.push(1LL * y * x);else st.push(y / x);}else{st.push(stoll(s));}}return st.top() ;}
};

224 . 基本计算器

直接用栈模拟 ;

class Solution {
public:void replace(string& s){int pos = s.find(" ");while (pos != -1) {s.replace(pos, 1, "");pos = s.find(" ");}}int calculate(string s) {// 存放所有的数字stack<int> nums;// 为了防止第一个数为负数,先往 nums 加个 0nums.push(0);// 将所有的空格去掉replace(s);// 存放所有的操作,包括 +/-stack<char> ops;int n = s.size();for(int i = 0; i < n; i++) {char c = s[i];if(c == '(')ops.push(c);else if(c == ')') {// 计算到最近一个左括号为止while(!ops.empty()) {char op = ops.top();if(op != '(')calc(nums, ops);else {ops.pop();break;}}}else {if(isdigit(c)) {int cur_num = 0;int j = i;// 将从 i 位置开始后面的连续数字整体取出,加入 numswhile(j <n && isdigit(s[j]))cur_num = cur_num*10 + (s[j++] - '0');// 注意上面的计算一定要有括号,否则有可能会溢出nums.push(cur_num);i = j-1;}else {if (i > 0 && (s[i - 1] == '(' || s[i - 1] == '+' || s[i - 1] == '-')) {nums.push(0);}// 有一个新操作要入栈时,先把栈内可以算的都算了while(!ops.empty() && ops.top() != '(')calc(nums, ops);ops.push(c);}}}while(!ops.empty())calc(nums, ops);return nums.top();}void calc(stack<int> &nums, stack<char> &ops) {if(nums.size() < 2 || ops.empty())return;int b = nums.top(); nums.pop();int a = nums.top(); nums.pop();char op = ops.top(); ops.pop();nums.push(op == '+' ? a+b : a-b);}
};

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

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

相关文章

eeeeeeeeeeeeeeeeee

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

(基础算法)归并排序

1.确定分界点 mid &#xff08;lr&#xff09;/2 2.递归排序左右两段 3.归并----合二为一 #include<iostream> using namespace std; //归并排序----分治 const int N10010; int n; int q[N],tmp[N];//需要一个额外数组void mergesort(int q[],int l,int r)//l左边界&a…

用EXCEL从地址(上海)中提取各区(浦东新区等区)信息

背景&#xff1a; 朋友工作需要经常用EXCEL把各上海用户收货地址中的区提取出来&#xff0c;之前一直手动处理&#xff0c;希望我帮忙用EXCEL公式直接提取处理。 数据样式&#xff1a; 中国上海市浦东新区A小区 上海徐汇区B小区 中国&#xff0c;上海&#xff0c;浦东新区&a…

ncstisc-2018-babydriver:UAF

启动脚本 #! /bin/sh qemu-system-x86_64 \-initrd rootfs.cpio \-kernel bzImage \-append consolettyS0 root/dev/ram oopspanic panic1 /dev/null \-m 64M --nographic \-smp cores1,threads1 -cpu kvm64,smep只可开启了smep保护 题目信息 babyopen 每次open(驱动名称)&…

学习通考试怎么搜题找答案? #学习方法#微信#其他

大学生必备的做题、搜题神器&#xff0c;收录上万本教材辅助书籍&#xff0c;像什么高数、物理、计算机、外语等都有&#xff0c;资源十分丰富。 1.菜鸟教程 菜鸟教程是一个完全免费的编程学习软件。 它免费提供了HTML / CSS 、JavaScript 、服务端、移动端、XML 教程、http…

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…

Webshell一句话木马

一、webshell介绍&#xff08;网页木马&#xff09; 分类&#xff1a; 大马&#xff1a;体积大、隐蔽性差、功能多 小马&#xff1a;体积小&#xff0c;隐蔽强&#xff0c;功能少 一句话木马&#xff1a;代码简短&#xff0c;灵活多样 二、一句话木马&#xff1a; &#xff1a;…

12 ABC串口接收原理与思路

1. 串口接收原理 基本原理&#xff1a;通过数据起始位判断要是否要开始接收的数据&#xff0c;通过采样的方式确定每一位数据是0还是1。 如何判断数据起始位到来&#xff1a;通过边沿检测电路检测起始信号的下降沿 如何采样&#xff1a;一位数据采多次&#xff0c;统计得到高…

【漏洞复现】狮子鱼CMS某SQL注入漏洞

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

【EAI 011】SayCan: Grounding Language in Robotic Affordances

论文标题&#xff1a;Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 论文作者&#xff1a;Michael Ahn, Anthony Brohan, Noah Brown, Yevgen Chebotar, Omar Cortes, Byron David, Chelsea Finn, Chuyuan Fu, Keerthana Gopalakrishnan, Karol Hausm…

【教学类-46-06】福字门贴1.0(五款空心字体)

背景需求&#xff1a; 前期使用五款字体制作了吉祥字门贴的设计&#xff0c;在掌握五款空心字在15*15CM手工纸内最适合的大小结构后&#xff0c;则需要制作“五款福字”——用统一个文本框模板&#xff0c;写入不同空心字体的“福字” 链接5个 【教学类-46-01】吉祥字门贴1.0&…

小巨人大爆发:紧凑型大型语言模型效率之谜揭晓!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…