Discuss / Java / 进阶练习2:后缀表达式

进阶练习2:后缀表达式

Topic source

D

#1 Created at ... [Delete] [Delete and Lock User]


package com.itranswarp.learnjava;



import java.util.*;



/**

 * Learn Java from https://www.liaoxuefeng.com/

 * 

 * @author liaoxuefeng

 */

public class Main {

	public static void main(String[] args) {

		String exp = "x + 2 * (y - 5)";

		SuffixExpression se = compile(exp);

		Map<String, Integer> env = Map.of("x", 1, "y", 9);

		int result = se.execute(env);

		System.out.println(env);

		System.out.println(exp + " = " + result + " " + (result == 1 + 2 * (9 - 5) ? "yes" : "no"));

	}



	static SuffixExpression compile(String exp) {

		// TODO:

		Deque<String> nums = new LinkedList<>();

    	Deque<String> symbols = new LinkedList<>();

    	

    	for (int i = 0; i < exp.length(); i++) {

			String n = exp.charAt(i) + "";

			if (n.equals(" ") || n.equals("(") || n.equals(")")) continue; 

			if (n.equals("+") || n.equals("-") || n.equals("*") || n.equals("/")) {

				symbols.push(n);

				continue;

			}

			nums.push(n);

		}

    	

        return new SuffixExpression(nums, symbols);

	}

}



class SuffixExpression {

	Deque<String> nums;

	Deque<String> symbols;

	

	public SuffixExpression(Deque<String> nums, Deque<String> symbols) {

		this.nums = nums;

		this.symbols = symbols;

	}

	

	int execute(Map<String, Integer> env) {

		// TODO:

		int res = 0;

		while (symbols.size() != 0) {

			String last = nums.pop();

			String pre = nums.pop();

			String symb = (String) symbols.pop();

			

			int lastV = env.get(last) == null ? Integer.parseInt(last): env.get(last);

			int preV = env.get(pre) == null ? Integer.parseInt(pre): env.get(pre);

			

			switch(symb) {

			case "+": 

				res = preV + lastV;

				break;

			case "-": 

				res = preV - lastV;

				break;

			case "*": 

				res = preV * lastV;

				break;

			case "/": 

				res = preV / lastV;

				break;

			}

			nums.push(res + "");

		}

		return res;

	}

	

}




  • 1

Reply