码迷,mamicode.com
首页 > 其他好文 > 详细

学习笔记:后缀表达式

时间:2018-01-25 18:53:13      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:imp   ret   for   public   map   amp   scanner   equals   exception   

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

①扫描中缀表达式。

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

③遇到左括号将其入栈。

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

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

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

 

二、后缀表达式求解

①扫描后缀表达式。

②遇到数字时将其入栈。

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

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

 

三、实现

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));
    }
}

 

学习笔记:后缀表达式

标签:imp   ret   for   public   map   amp   scanner   equals   exception   

原文地址:https://www.cnblogs.com/arseneyao/p/8351330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!