栈(经典应用逆波兰表达式)

来源:互联网 发布:mac版剪辑视频软件 编辑:程序博客网 时间:2024/05/21 12:14

java中栈继承了Vector,源码很简单,采用的是顺序存储结构。
实现栈:

import java.util.Arrays;public class Stack {    private Object[] elementData;    private int size;    public Stack() {        this(10);    }    public Stack(int initialCapacity) {        this.elementData = new Object[initialCapacity];    }    public int size() {        return this.size;    }    public Object push(Object obj) {        // 检查表空间是否以满        check(size + 1);        elementData[size++] = obj;        return obj;    }    private void check(int minCapacity) {        if (minCapacity - elementData.length < 0) {            int oldCapactity = elementData.length;            int newCapacity = oldCapactity << 1;            elementData = Arrays.copyOf(elementData, newCapacity);        }    }    public Object pop() {        final Object last;        last = elementData[size - 1];        elementData[size - 1] = null;        size--;        return last;    }    public static void main(String[] args) {        Stack s = new Stack();    }}

逆波兰表达式:

package demo;import java.util.Scanner;import java.util.Stack;public class Test {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        String input = scanner.nextLine();        char[] data = input.toCharArray();        StringBuilder sb = new StringBuilder();        Stack<Character> ops = new Stack<>();        Stack<Double> vals = new Stack<>();        toPostfix(data, sb, ops);        scanner.close();        // 9+(3-1)*3+8/2        calculate(sb, vals);        System.out.println(sb.toString());        System.out.println("----");        System.out.println(vals.pop());    }    /**     * @param sb     * @param vals     *            存后缀表达式的栈     */    public static void calculate(StringBuilder sb, Stack<Double> vals) {        for (int i = 0; i < sb.length(); i++) {            Character c = sb.charAt(i);            System.out.println(c);            // 将数字压入栈            if (getPriority(c) == 0) {                vals.push(Double.valueOf(c.toString()));            } else { // 弹出栈顶的元素,计算压入栈                Double top = vals.pop();                Double second = vals.pop();                double result = 0;                if (c.equals('-'))                    result = second - top;                if (c.equals('+'))                    result = second + top;                if (c.equals('*'))                    result = second * top;                if (c.equals('/'))                    result = second / top;                vals.push(result);            }        }    }    /**     * @param data     *            输入的数据     * @param sb     *            保存后缀表达式     * @param ops     *            存运算符的栈     */    public static void toPostfix(char[] data, StringBuilder sb, Stack<Character> ops) {        int priority = 0;// 标记栈顶元素的优先级        for (int i = 0; i < data.length; i++) {            Character c = data[i];            System.out.println(c);            // 遇到右括号弹出栈顶运算符            if (c.equals(')')) {                Character popData = ops.pop();                sb.append(popData);            }            // 如果是运算符            if (getPriority(c) != 0) {                // 比较栈顶运算符优先级,大于等于压入栈,否则弹出全部                if (getPriority(c) >= priority) {                    ops.push(c);                    priority = getPriority(c);                } else {                    while (!ops.isEmpty()) {                        Character popData = ops.pop();                        sb.append(popData);                    }                    // 将当前运算符压入栈                    ops.push(c);                }            } else if (!c.equals('(') && !c.equals(')')) {                sb.append(c + ' ');            }        }        // 将栈内所有剩余的运算符弹出        while (!ops.isEmpty()) {            sb.append(ops.pop());        }    }    /**     * @param c     * @return 返回运算符的优先级     */    private static int getPriority(char c) {        switch (c) {        case '+':        case '-':            return 1;        case '*':        case '/':            return 2;        default:            return 0;        }    }}

只能输入数字1-9,双位数判断没有想通请大神指教