学习笔记:后缀表达式

Posted arseneyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记:后缀表达式相关的知识,希望对你有一定的参考价值。

一、中缀表达式转换为后缀表达式

①扫描中缀表达式。

②遇到数字将其存入后缀表达式。

③遇到左括号将其入栈。

④遇到右括号,出栈运算符并存入后缀表达式,直至遇到左括号,将左括号出栈结束。

⑤遇到运算符,出栈运算符并存入后缀表达式,直到栈顶为优先级更小的运算符、左括号或空栈,将遇到的运算符入栈结束。

⑥扫描结束后将栈中的所有运算符出栈并存入后缀表达式。

 

二、后缀表达式求解

①扫描后缀表达式。

②遇到数字时将其入栈。

③遇到运算符出栈两个数字进行运算,将结果入栈。

④扫描结束后栈顶的数字即为最终结果。

 

三、实现

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;

public class Calculator {
    private static LinkedList<String> translate(String exp) {
        HashMap<Character, Integer> priority = new HashMap<>();
        priority.put(‘+‘, 0);
        priority.put(‘-‘, 0);
        priority.put(‘*‘, 1);
        priority.put(‘/‘, 1);

        LinkedList<String> linkedList = new LinkedList<>();
        Stack<Character> stack = new Stack<>();
        StringBuilder temp = new StringBuilder();
        for (int i = 0; i < exp.length(); i++) {
            char c = exp.charAt(i);
            if (Character.isDigit(c)) {
                temp.append(c);
                if (i + 1 == exp.length() || !Character.isDigit(exp.charAt(i + 1))) {
                    linkedList.add(temp.toString());
                    temp.delete(0, temp.length());
                }
            } else if (c == ‘(‘) {
                stack.push(c);
            } else if (c == ‘)‘) {
                while (!stack.empty() && !stack.peek().equals(‘(‘))
                    linkedList.add(stack.pop().toString());
                stack.pop();
            } else {
                while (!stack.empty() && !stack.peek().equals(‘(‘) && priority.get(c) >= priority.get(stack.peek()))
                    linkedList.add(stack.pop().toString());
                stack.push(c);
            }
        }
        while (!stack.empty())
            linkedList.add(stack.pop().toString());
        return linkedList;
    }

    public static int solve(String exp) {
        LinkedList<String> linkedList = translate(exp);
        Stack<Integer> cache = new Stack<>();
        for (String str : linkedList)
            try {
                cache.push(Integer.parseInt(str));
            } catch (NumberFormatException exc) {
                int rhs = cache.pop();
                int lhs = cache.pop();
                switch (str) {
                    case "+": cache.push(lhs + rhs); break;
                    case "-": cache.push(lhs - rhs); break;
                    case "*": cache.push(lhs * rhs); break;
                    case "/": cache.push(lhs / rhs); break;
                }
            }
        return cache.pop();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String expr = scanner.nextLine();
        System.out.println(solve(expr));
    }
}

 

以上是关于学习笔记:后缀表达式的主要内容,如果未能解决你的问题,请参考以下文章

Jsp入门EL表达式_学习笔记

栈和队列学习笔记(21.10.12)

JSP学习笔记:JSP语法和指令

学习笔记:python3,代码片段(2017)

学习笔记:后缀数组

Python学习笔记之正则表达式