Stack

栈,只有栈顶可以操作,先进后出,后进先出。

 java中的Stack 继承了Vector类,是线程安全的。

参考:https://blog.csdn.net/f2006116/article/details/51375225

 

栈的使用:

中缀表达式转后缀,然后计算表达式的值。

中缀(1+3*(9-2)+9)转后缀(1 3 9 2 - * + 9 +):

  从头遍历中缀表达式:

             1。如果是数字,那么直接输出到结果集

                                            2。如果是操作符(右括号除外),则直接将其放到栈中。

                                            3。如果是右括号,则开始pop栈,输出结果集,直到pop出左括号,左括号不输出

                                            4。如果是操作符,且操作符的优先级比此时栈顶的操作符优先级低或者相等,那么需要pop栈,直到 栈空 或者 栈顶操作符的优先级小于此操作符。再将该操作符push至栈中。 比如遇到了+号, 此时栈是 + - *   这时候需要将+-*三个元素全部pop输出,将+ push至栈中 

                                             5。表达式遍历完毕后,如果此时栈不为空,需要将栈pop输出直至为空。

 

   

代码示例:结果集也使用的是栈,可以换数组来实现。操作符仅考虑了  + - * /  括号,+-一个优先级,*/ 一个优先级 

 

package com.dh.learn.collection;

import java.util.Stack;

public class LearnStack {
    public static void main(String[] args) {
        Stack<String> data = new Stack<>();
        Stack<Character> oper = new Stack<>();

        String expec = "1+2*3+(4*5+6)*7";
        boolean preIsNum = false;
        //中缀表达式转后缀
        for (Character character : expec.toCharArray()) {
            // 如果character是数字,直接入data栈
            if (isNum(character)) {
                //如果上一个也是数字,则表示是两个连续的数字
                if (preIsNum) {
                    data.push(data.pop() + character.toString());
                } else {
                    data.push(String.valueOf(character));
                }
                preIsNum = true;
            } else {
                preIsNum = false;
                //如果操作符栈为空,直接push
                if (oper.isEmpty() || character == '(' || character == '*' || character == '/') {
                    oper.push(character);
                } else if (character == ')') {
                    //操作符是右括号,取操作符栈的数据放到data中,直到遇到左括号
                    Character p = oper.pop();
                    while (p != '(') {
                        data.push(p.toString());
                        if (oper.isEmpty()) {
                            break;
                        }
                        p = oper.pop();
                    }
                } else {
                    //比较优先级 此时character是 +  -
                    Character top = oper.peek();
                    if (top == '*' || top == '/') {
                        while (oper.peek() != '(') {
                            top = oper.pop();
                            data.push(top.toString());
                            if (oper.isEmpty()) {
                                break;
                            }
                        }
                    }
                    oper.push(character);
                }
            }
        }

        while (!oper.isEmpty()) {
            data.push(oper.pop().toString());
        }
        System.out.println(data);
        Stack<Integer> value = new Stack<>();
        for (String s : data) {
            switch (s) {
                case "+":
                    value.push(value.pop() + value.pop());
                    break;
                case "-":
                    value.push(-(value.pop() - value.pop()));
                    break;
                case "*":
                    value.push(value.pop() * value.pop());
                    break;
                case "/":
                    int vx = value.pop();
                    int vy = value.pop();
                    value.push(vy / vx);
                    break;
                default:
                    value.push(Integer.valueOf(s));
            }
        }

        System.out.println(value.pop());
    }

    private static boolean isNum(Character character) {
        return character >= '1' && character <= '9';
    }
}

 

输出结果:

[1, 2, 3, *, +, 4, 5, *, 6, +, 7, *, +]
189

 

 

  

  

posted on 2019-08-13 11:23  李笑白  阅读(263)  评论(0编辑  收藏  举报

导航