当前位置: 首页 > news >正文

Java数据结构——Stack

Stack

  • 栈的概念和使用
    • 栈的概念
    • 栈的使用
  • 栈的应用
    • 出栈元素序列
    • 有效的括号
    • 栈的压入、弹出序列
    • 逆波兰表达式
    • 最小栈

栈的概念和使用

栈的概念

栈(Stack):一种特殊的线性表,只允许再栈的一端进行插入和删除元素,这一端点被称为栈顶另一端就是栈顶
栈中有两种使用:
入栈(push):插入数据进入栈中,入栈在栈顶
出栈(pop):删除栈中数据,出的是栈顶的数据
遵循的是先入后出的原则

在这里插入图片描述

栈的使用

方法功能
Stack()构造空的栈
E push(E e)将e入栈,返回e
E pop()将栈顶元素取出
E peek()获取栈顶元素
int size()栈的有效元素个数
boolean empty()判断栈是否为空

E push(E e) 将e入栈,返回e

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(10);System.out.println(stack);}
}

运行结果如下
在这里插入图片描述

E pop() 将栈顶元素取出
E peek() 获取栈顶元素

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(10);System.out.println(stack);int ret = stack.pop();//10 ,取出栈顶元素int ret1 = stack.peek();//2 //获取栈顶元素是多少System.out.println(ret);System.out.println(ret1);System.out.println("出栈后"+stack);//出栈后,栈中数据 1 2}
}

这里的pop是出栈的意思,而peek()只是获取其栈顶元素,并不是出栈,不会影响栈中元素
所以这里会取出栈顶元素10 而 在获取栈顶元素是2,最终栈中元素是1 2
在这里插入图片描述

int size() 栈的有效元素个数
boolean empty() 判断栈是否为空

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(3);stack.push(5);stack.push(11);System.out.println(stack.size());//栈的元素个数 5 System.out.println(stack.empty());//这里栈不为空,false}
}

在这里插入图片描述

栈的应用

出栈元素序列

题目:若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的⼀个出栈序列是()
A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1
答案是 C
A : 如果是1进栈,1出栈,在将1 2 3放入进去再出栈,这样出栈结果就1 4 3 2
B: 1进栈,先不出来,2 3 4依次进栈后就出栈,这样结果出栈结果为 2 3 4 1
C: 先出3 说明 1 2 3已经进栈了,3 出栈 2就是栈顶,不可以直接出1,所以错误
D 1 2 进栈,3 4分别进栈后出栈,最后出栈2 1结果为 3 4 2 1
在这里插入图片描述
C选项错误,所以选C

有效的括号

在这里插入图片描述

目的:括号是否可以左右匹配成功 “()” 或者 "([ ])"类型的都是匹配成功
思路:1创建一个Character类型的栈
2.如果遇到左边括号就将其放入栈中遇到右括号就与栈顶括号元素进行匹配,匹配不成功就直接返回false,匹配成功就继续向后匹配,入栈重复操作
3 在匹配的时候,如果栈为空,返回false
4.最后右括号匹配完成,但是栈不为空也返回false

在这里插入图片描述
在这里插入图片描述

1.这里再进行匹配的时候如果栈为空说明没有其右括号左边没有左括号入栈
2.如果匹配失败直接
3.最后字符串遍历完了,但是不为空,说明栈中的左括号没有全部匹配
这上面三种情况不符合要求直接返回false
class Solution {public boolean isValid(String s) {//创建一个Character的栈Stack<Character> stack = new Stack<>();//遍历for(int i = 0;i<s.length();i++){char ch= s.charAt(i);//左括号入栈if(ch=='('||ch=='{'||ch=='['){stack.push(ch);}else{//匹配//1.判断栈是否为空if(stack.empty()){return false;}//2.出栈进行匹配char ch2 = stack.peek();if(ch2=='('&&ch==')'||ch2=='['&&ch==']'||ch2=='{'&&ch=='}'){stack.pop();}else{//不匹配return false;}}}//最后如果栈不为空,说明还有没匹配的if(!stack.empty()){return false;}return true;}
}

栈的压入、弹出序列

在这里插入图片描述

目的:有一个所有数都不相同的pushV数组压栈顺序,有一个和压栈的数相同出栈顺序,判断这个出栈顺序是否正确
思路:1.遍历这个pushV,将其元素进行入栈,2.并进行判断,栈顶元素是否与出栈顺序相同,相同就出栈,不相同就继续入栈,继续判断,重复操作
最后遍历完整个pushV数组,如果栈为空,说明其出栈顺序正确

在这里插入图片描述
在这里插入图片描述

1.这里的进行栈顶元素与popV判断明显是个while循环,因为可能连续出栈
2.并且这个循环不仅要判断是否相同也要注意栈不为空再进行判断
3.遍历完整个pushV数组后,最后如果栈为空说明出栈顺序是对的返回true,反之是false
import java.util.*;public boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereStack<Integer> stack = new Stack<>();int j=0;//遍历弹出序列for(int i = 0;i<pushV.length;i++){//入栈stack.push(pushV[i]);//根据给出弹出的序列看看是否要出栈while(!stack.empty()&&stack.peek()==popV[j]){j++;stack.pop();//出栈}}//如果最后stack为空,说明成功了return stack.empty();}
}

逆波兰表达式

在这里插入图片描述
逆波兰式
在这里插入图片描述

目的:给一个逆波兰表达式,求出其结果
思路:使用栈进行计算,遇到数字就入栈,反之就是运算符,就要出栈进行计算

在这里插入图片描述
在这里插入图片描述

1.这里就是遇到数字字符就进行入栈,这里注意将数字字符转为数字,
2.遇到运算符就要计算,将计算结果入栈
3.最后返回栈顶数据就是计算结果
class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack();for(String str: tokens){if(!isOperator(str)){stack.push(Integer.valueOf(str));//转换为数字入栈}else{//反之就出栈计算//将计算结果入栈int val1 = stack.pop();int val2 = stack.pop();switch(str){case "+":stack.push(val2+val1);break;case "-":stack.push(val2-val1);break;case "*":stack.push(val2*val1);break;case "/":stack.push(val2/val1);break;}}}return stack.pop();}//判断是不是运算符private boolean  isOperator(String s){if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){return true;}return false;}
}

最小栈

在这里插入图片描述

目的:获取其栈中最小元素
思路:就是创建两个栈,1.正常栈一个栈是正常将所有元素依靠顺序入栈,出栈
2.最小栈用来放栈中最小元素,栈顶是最小元素,这样获取最小元素的效率是O(1)

>

在这里插入图片描述

注意这里在入栈的时候也要将和最小栈相同的元素也要放入进去
出栈的时候,也要注意栈的最小元素可能发生变化,最小栈可能也要出栈
这时候无论如何,最小栈栈顶就是栈中最小的元素
class MinStack {private Stack<Integer> stack;private Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {//将=最小栈顶元素的值也要放入最小栈if(minStack.empty()||val<=minStack.peek()){minStack.push(val);}stack.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.xdnf.cn/news/157735.html

相关文章:

  • Gin框架
  • 【股票系统】使用docker本地构建ai-hedge-fund项目,模拟大师炒股进行分析。人工智能的对冲基金的开源项目
  • 测试用例的设计
  • 股指期货成交量是单边还是双边?
  • 慢查询日志对于分析mysql数据库性能有什么帮助
  • crossOriginLoading使用说明
  • 达芬奇模板 15组现代简洁文字标题动画 Modern Titles v2.0 DR
  • 搭建基于火灾风险预测与防范的消防安全科普小程序
  • 客户案例 | 光热+数智双驱动!恒基能脉的数字化协同与技术创新实践
  • 启动 n8n 步骤指南
  • x86系列CPU寄存器和汇编指令总结
  • 【新技术】微软 Azure Test Impact Analyzer (TIA) 全面解析
  • Python Cookbook-6.10 保留对被绑定方法的引用且支持垃圾回收
  • Spark 极速回顾
  • AIGC在游戏开发中的革命:自动化生成3A级游戏内容
  • 如何使用WebRTC
  • Cisco Packet Tracer使用 搭建网络拓扑
  • 3、LangChain基础:LangChain Tools Agent
  • 【Kafka】Windows环境下生产与消费流程详解(附流程图)
  • proxychains4系统代理for linux(加速国内github下载速度,pip安装)
  • pytorch python常用指令
  • 2025.04.26-美团春招笔试题-第二题
  • 线性代数(一些别的应该关注的点)
  • 立创EDA
  • 25【干货】在Arcgis中根据字段属性重新排序并自动编号的方法(二)
  • 【AI论文】VisuLogic:评估多模态大语言模型中视觉推理的基准
  • MySQL 中 SQL 语句的详细执行过程
  • Windows 安装 Neo4j 教程
  • 【Android】四大组件之Activity
  • 深入解析Spring Boot配置处理器:机制、架构与实践