表达式计算

解析 这题是典型的栈的运用的题目,一开始看着容易上手,还是有点容易错。

package _3_5_test;

import java.util.Scanner;
import java.util.Stack;

import org.omg.CORBA.PUBLIC_MEMBER;

/*表达式计算
 * 先分割表达式,根据运算符号进行分割
 * 有乘除的先进行运算
 * 有括号的先进行运算
 * */
public class SeventyThree {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);

		String s = scanner.nextLine();

		Stack<Integer> nums = new Stack<Integer>(); // 保存数字
		Stack<Character> opes = new Stack<Character>(); // 保存操作符

		// 将字符串转换成字符数组,便于后面进行遍历操作
		char cs[] = s.toCharArray();

		// 用于存放数字
		int n = 0;

		// 遍历一遍字符串中所有的字符:分为以下几种情况进行处理
		for (int i = 0; i < cs.length; i++) {
			char temp = cs[i];
			if (Character.isDigit(temp)) {// 如果当前的字符是数字,存入n中,要考虑大于10的数字的进位情况
				n = n * 10 + Integer.parseInt(String.valueOf(temp));
			} else {// 如果当前的字符不是数字,进行字符判断,区分是四则运算符号还是括号
				if (n != 0) {// 如果n不等于0,说明已经取了运算符号左边的值,将这个值放进栈中
					nums.push(n);
					n = 0;
				}
				if (temp == '(') {// 如果当前字符是左括号,将字符存入栈中,再取下一个字符
					opes.push(temp);
				} else if (temp == ')') {// 计算括号中的内容
					while (opes.peek() != '(') {
						// 从数字栈和操作符栈取出顶部的值,进行运算,并将最终结果存进数字栈中
						int t = cal(nums.pop(), nums.pop(), opes.pop());
						nums.push(t);
					}
					opes.pop();//括号内运算完毕,取出左括号
				} else if (pre(temp) > 0) {// 如果当前符号是四则运算符
					if (opes.isEmpty()) {// 如果当前的符号栈中没有运算符号,则将当前的预算符号直接加进栈中
						opes.push(temp);
					} else {// 如果栈中已经存在的运算符号,则要进行优先级的判断
						if (pre(opes.peek()) >= pre(temp)) {
							int t = cal(nums.pop(), nums.pop(), opes.pop());
							nums.push(t);
						}
						opes.push(temp);
					}
				}
			}

		}
		if (n != 0) {
			nums.push(n);
		}
		while (!opes.isEmpty()) {
			int t = cal(nums.pop(), nums.pop(), opes.pop());
			nums.push(t);
		}
		System.out.println(nums.pop());

	}

	// 自定义一个符号优先级判断方法
	public static int pre(Character c) {
		if (c == '+' || c == '-') {
			return 1;
		} else if (c == '*' || c == '/') {
			return 2;
		} else {
			return 0;
		}
	}

	// 自定义一个四则运算方法,因为栈先进后出的特性,所以b是在前面的数值,a是在后面的数值
	public static int cal(int a, int b, Character sign) {
		switch (sign) {
		case '+':
			return b + a;
		case '-':
			return b - a;
		case '*':
			return b * a;
		case '/':
			return b / a;
		}
		return 0;
	}

}

原文地址:https://www.cnblogs.com/lyd447113735/p/12691504.html