当前位置:   article > 正文

【Java--数据结构】栈的应用

【Java--数据结构】栈的应用

欢迎关注个人主页逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

将递归转化为循环

逆波兰表达式

有效的括号

栈得压入、弹出系列

最小栈


将递归转化为循环

把递归代码实现为非递归代码

比如:逆序打印链表

  1. // 递归方式
  2. void printList(Node head){
  3.    if(null != head){
  4.        printList(head.next);
  5.        System.out.print(head.val + " ");
  6.   }
  7. }
  8. // 循环方式
  9. void printList(Node head){
  10.    if(null == head){
  11.        return;
  12.   }
  13.    
  14.    Stack<Node> s = new Stack<>();
  15.    // 将链表中的结点保存在栈中
  16.    Node cur = head;
  17.    while(null != cur){
  18.        s.push(cur);
  19.        cur = cur.next;
  20.   }

逆波兰表达式

也叫后缀表达式(运算符在操作数的后面),好处是:忽略运算符的优先级

我们平时运算加减乘除的式子其实是 中缀表达式 

比如式子a+b*c+(d*e+f)*g转成逆波兰表达式 abc*+de*f+g*+

逆波兰表达式的运算规则:

  1. 将操作数压入栈中
  2. 遇到运算符弹出操作数(分别作为右操作数和左操作数)计算
  3. 将计算的结果压入栈中

比如式子1+2*3+(4*5+6)*7

逆波兰表达式1 2 3*4 5*6 +7 *+

  • 将1 2 3压入栈内,
  • 遇到*,取出2和3,计算2*3得6
  • 将6压入栈
  • 又遇到+,取出6和1,计算6+1得7

……

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。oj链接

  1. class Solution {
  2. public int evalRPN(String[] tokens) {
  3. Stack<Integer> stack=new Stack<>();
  4. for(int i=0;i<tokens.length;i++){
  5. String tmp=tokens[i];
  6. if(!isOperation(tokens[i])){
  7. Integer val=Integer.valueOf(tmp);//将字符转化为整形
  8. stack.push(val);
  9. }else{
  10. Integer val2=stack.pop();//val2作为右操作数
  11. Integer val1=stack.pop();
  12. switch(tmp){
  13. case "+":
  14. stack.push(val1+val2);
  15. break;
  16. case "-":
  17. stack.push(val1-val2);
  18. break;
  19. case "*":
  20. stack.push(val1*val2);
  21. break;
  22. case "/":
  23. stack.push(val1/val2);
  24. break;
  25. }
  26. }
  27. }
  28. return stack.pop();
  29. }
  30. //判断字符是否是 运算符
  31. public boolean isOperation(String s){
  32. if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
  33. return true;
  34. }
  35. return false;
  36. }
  37. }

有效的括号

oj链接

括号匹配:栈最终为空,且字符串已经遍历完了

不匹配:

  • 左括号与右括号不匹配    [ ( ] )
  • 字符串没有遍历完,遇到了右括号,但栈为空   (  )  )))
  • 字符串遍历完,但栈里还有左括号(((  )
  • 右括号在前面 )((
  1. class Solution {
  2. public boolean isValid(String s) {
  3. Stack<Character> stack=new Stack<>();
  4. for(int i=0;i<s.length();i++){
  5. char ch=s.charAt(i);
  6. if(ch=='('||ch=='['||ch=='{'){
  7. stack.push(ch);
  8. }else{
  9. //遇到右括号
  10. if(stack.empty()){
  11. return false;//栈为空,没有左括号与之匹配
  12. }else{
  13. //取栈顶元素左括号 看与当前右括号是否匹配
  14. char chL=stack.peek();
  15. if(chL=='('&&ch==')'
  16. ||chL=='['&&ch==']'
  17. ||chL=='{'&&ch=='}'){
  18. stack.pop();//说明当前这个括号匹配,所以要扔出去
  19. }else{
  20. return false;
  21. }
  22. }
  23. }
  24. }
  25. return stack.empty();//如果循环走完,栈为空,返回真
  26. }
  27. }

栈得压入、弹出系列

oj链接

1. 遍历pushV数组,入栈,每次入栈后判断和popV数组的下标j是否一致

2.不一样,继续i++(继续进栈);

一样,出栈,j++

3.出栈时,若一直一样就一直出,遇到不一样的,i++继续入栈;

注意:

  1. j的条件:不能越界(超过popV的长度)
  2. 栈不能为空
  3. stack.peek()==popV[j] 引用类型时要用equals判断,这里为简单类型int.
  1. public boolean IsPopOrder (int[] pushV, int[] popV) {
  2. // write code here
  3. Stack<Integer> stack=new Stack<>();
  4. int j=0;
  5. for(int i=0;i<pushV.length;i++){
  6. stack.push(pushV[i]);
  7. while(j<popV.length&&!stack.empty()&&
  8. stack.peek()==popV[j]){
  9. stack.pop();
  10. j++;
  11. }
  12. }
  13. return stack.empty();
  14. }
  15. }

最小栈

oj链接

 分别创建两个栈:普通栈 和 最小栈

push存放元素的过程:

  1. 如果是第一次存放元素,普通栈和最小栈都得存放元素;
  2. 如果不是第一次存放,普通栈里,需要比较的普通栈的栈顶元素和最小栈的,只有小于等于才能放入最小栈里。

pop取元素的过程(返回值是普通站的元素):

每次pop元素时需要判断出栈的元素是不是和最小栈的栈顶元素一样,若一样,最小栈也得pop

top瞄一眼(相当于peek,返回的是普通栈的值)

getMin获取最小栈的栈顶元素

  1. import java.util.Stack;
  2. class MinStack {
  3. public Stack<Integer> stack;
  4. public Stack<Integer> minStack;
  5. public MinStack() {
  6. stack=new Stack<>();
  7. minStack=new Stack<>();
  8. }
  9. public void push(int val) {
  10. stack.push(val);
  11. if(minStack.empty()){
  12. minStack.push(val);
  13. }else{
  14. Integer peekVal=minStack.peek();
  15. if(val<=peekVal){
  16. minStack.push(val);
  17. }
  18. }
  19. }
  20. public void pop() {
  21. if (stack.empty()) {
  22. return;
  23. }
  24. int popVal=stack.pop();
  25. if(popVal==minStack.peek()){
  26. minStack.pop();
  27. }
  28. }
  29. public int top() {
  30. if(stack.empty()){
  31. return -1;
  32. }
  33. return stack.peek();
  34. }
  35. public int getMin() {
  36. if(minStack.empty()){
  37. return -1;
  38. }
  39. return minStack.peek();
  40. }
  41. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/852730
推荐阅读
相关标签
  

闽ICP备14008679号