栈练习题(逆波兰表达式,有效括号,出入栈次序匹配,最小栈)

news/2024/10/19 9:36:55/

目录

基础知识:

中缀表达式和后缀表达式(逆波兰式)

中缀表达式转后缀表达式

后缀表达式求结果

有效括号

栈的压入,弹出序列

最小元素栈


基础知识:

栈:是一种先入后出数据结构,它的底层是由数组实现的

入栈:push(),出栈pop(),查看栈顶元素peek()

中缀表达式和后缀表达式(逆波兰式)

中缀表达式:我们日常所使用的加减乘除表达式
后缀表达式:计算器在计算的时候,是把我输入的中缀表达式转化成后缀表达式进行计算的

中缀表达式转后缀表达式

例:中缀表达式: a + b*c +(d*e+f)*g ,转换成后缀表达式

第一步: 从左向右先乘除后加减给中缀表达式加括号

第二步: 把每个运算符都移动到相对应的括号外面(每个运算符都有自己的括号)

后缀表达式求结果

例: 求123* + 45*6 + 7*的结果

解题方法:

遍历表达式,遇到数字就入栈,遇到运算符出栈俩个元素,栈顶元素作为右操作数,,第二个元素作为左操作数,求出运算结果,并把结果入到栈中,以此类推,遍历完表达式

 用代码实现:

力扣剑指Offer 036

https://leetcode.cn/problems/8Zf90G/

代码

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack();for(int i = 0;i<tokens.length;i++){if(tokens[i].equals("+")){int num1 = stack.pop();int num2 = stack.pop();stack.push(num2+num1);continue;}if(tokens[i].equals("-")){int num1 = stack.pop();int num2 = stack.pop();stack.push(num2-num1);continue;}if(tokens[i].equals("*")){int num1 = stack.pop();int num2 = stack.pop();stack.push(num2*num1);continue;}if(tokens[i].equals("/")){int num1 = stack.pop();int num2 = stack.pop();stack.push(num2/num1);continue;}int ret = Integer.parseInt(tokens[i]);stack.push(ret);}return stack.peek();}
}

 思路:就是刚刚上面求后缀表达式的思路

有效括号

力扣: https://leetcode.cn/problems/valid-parentheses/submissions/

 

思路:

创建一个栈,遍历给定字符串,当为左括号就入栈,当为右括号时先看栈是否为空,如果为空返回false,如果不为空,判断这俩个左右括号是否匹配,如果匹配就让这个栈顶元素出栈,依次类推,遍历整个字符串....遍历完成之后,判断栈是否为空,如果不为空(说明左括号多了),返回false,如果为空,则所有的括号都匹配上了返回 true

代码

class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack();for(int i = 0;i<s.length();i++){if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){stack.push(s.charAt(i));}else{if(stack.isEmpty())return false;char ret = stack.peek();if(ret=='('){if(s.charAt(i) == ')'){stack.pop();continue;}else{return false;}}if(ret=='['){if(s.charAt(i) == ']'){stack.pop();continue;}else{return false;}}if(ret=='{'){if(s.charAt(i) == '}'){stack.pop();continue;}else{return false;}}}}if(stack.isEmpty()){return true;}return false;}
}

栈的压入,弹出序列

https://leetcode.cn/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/description/ 

思路:创建一个栈,遍历压入序列初始下标为i,把压入数组一个一个压入到 栈中,判断这个数是否和弹出序列数组(初始下标为j).,是否相等,如果相等就弹出栈顶元素,j++,继续判断新的栈顶元素和新的弹出序列数组[j]是否相等,相等同样弹出栈顶元素,依次类推....遍历结束后判断栈中是否还有元素,如果有说明不可行,返回false,如果栈为空,则返回true

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {Stack<Integer> stack = new Stack();int j = 0;for(int i = 0;i<pushed.length;i++){stack.push(pushed[i]);while(j<pushed.length && !stack.isEmpty() && stack.peek()==popped[j]){stack.pop();j++;}}if(stack.isEmpty()){return true;}return false;}
}

最小元素栈

设计一个push,pop,peek()操作,并能在常数时间类检索到最小元素的栈

创建俩个栈,一个是普通栈,一个是最小栈

push操作:先把元素入到普通栈,判断最小栈是否为空,如果为空就入栈,然后再判断入栈的元素和最小栈的栈顶元素的大小,如果入栈的元素小于或等于最小栈的栈顶元素,就把这个元素也入到最小栈,此时最小栈里面放的元素一定都是最小值

pop操作,弹出普通栈的栈顶元素,再判断弹出的这个元素是否是最小栈的栈顶元素,如果是就把最小栈的栈顶元素也弹出

top操作,栈顶元素,也就是普通栈的栈顶元素

getMin操作,得到最小值,,,,最小栈的栈顶元素就是最小值

class MinStack {private Stack<Integer> stack;private Stack<Integer> minStack;public MinStack() {stack = new Stack();minStack = new Stack();}public void push(int val) {stack.push(val);if(minStack.isEmpty()){minStack.push(val);return;}if(val<=minStack.peek()){minStack.push(val);}}public void pop() {if(stack.peek().equals(minStack.peek())){minStack.pop();}stack.pop();}public int top() {return stack.peek();}public int getMin() {return minStack.peek();}
}


http://www.ppmy.cn/news/950380.html

相关文章

ChatGPT教程:如何优化我们编写的Python代码?

背景介绍 作为一名程序员&#xff0c;我们经常需要编写Python代码。然而&#xff0c;代码质量的好坏直接关系到程序的可读性、可维护性和可扩展性。因此&#xff0c;我们需要使用一些工具来帮助我们提高代码质量。ChatGPT是一种强大的自然语言处理模型&#xff0c;可以帮助我们…

ChatGPT基础入门教程

ChatGPT 入门教程 ChatGPT 是 OpenAI 开发的一款基于 GPT-3.5 技术的自然语言处理软件&#xff0c;可以用来创建智能聊天机器人。它可以通过分析对话中的用户输入和上下文来回答问题、提供建议等。 安装 你可以在 OpenAI 的网站上注册账号&#xff0c;并申请 API 密钥才能使…

《ChatGPT教程》(2)

五、ChatGPT应用实例 5.1 自动生成摘要 ChatGPT可以用于从长篇文章中自动生成摘要。您只需将完整文章作为输入&#xff0c;要求模型生成摘要&#xff0c;例如&#xff1a; "Please summarize the following article: [Insert the full text of the article]" 根据需…

ChatGPT教程:Python代码优化之格式化

背景 在编写Python代码时&#xff0c;代码的格式化是一个非常重要的环节&#xff0c;良好的代码格式可以提高代码的可读性和可维护性。而ChatGPT是一种基于Transformer的自然语言处理模型&#xff0c;可以用于自然语言生成和理解&#xff0c;因此可以很好地帮助我们在格式化代…

ChatGPT教程之 04 使用 ChatGPT 解决 Leetcode 难题?

虽然 ChatGPT 令人印象深刻,但它似乎无法轻松给出复杂问题的正确答案。我尝试使用 ChatGPT 解决前 10 个 Leetcode 难题(标记在热门面试问题下)以验证相同的问题。 您可以在此处找到问题:问题集。其中一些包括著名的问题,例如滞留雨水和滑动窗户。 我不会在本文中浪费您…

ChatGPT聊天机器人搭建全攻略精心整理汇总:微信 Discord 小爱同学 VSCode QQ 飞书 Siri OpenAI Translato翻译插件

一、ChatGPT接入微信&#xff1a; ChatGPT接入微信 ChatGPT近期以强大的对话和信息整合能力风靡全网&#xff0c;可以写代码、改论文、讲故事&#xff0c;几乎无所不能&#xff0c;这让人不禁有个大胆的想法&#xff0c;能否用他的对话模型把我们的微信打造成一个智能机器人&am…

本地部署chatgpt

下载python3.7以上版本 安装 pip install pandora-chatgpt 安装完成 输入网址(要先登录chatgpt) https://chat.openai.com/api/auth/session 复制accseeToken的内容存为token.txt 在token.txt同一个目录下进入cmd 输入 pandora.exe -t .\token.txt 或者 然后在浏览器输入127…

ChatGPT API 技巧教程

导语&#xff1a;ChatGPT作为一种基于人工智能的自然语言处理工具&#xff0c;可以帮助你更好地解决这些问题&#xff0c;提高质量和效率。那么&#xff0c;本文将介绍如何使用ChatGPT的API接口&#xff0c;高效响应结果。 介绍了如何全流程使用ChatGPT&#xff0c;在实际应用…