Java代码实现表达式计算(带括号)
Java代码实现表达式计算(带括号)
思路分析:
-
如果是数字,直接放入数栈
-
如果是操作符
2.1 判断符号栈是否为空,如果为空直接放入符号栈
2.2 如果不为空,判断当前符号
2.2.1 是否为括号,如果是"(",直接放入符号栈;如果是")",数栈弹出两个数,符号栈弹出符号继续运算,结果入栈,直到弹出的符号为"("
2.2.2 是否为操作符,如果是则判断和栈顶符号的优先级,小于等于则数栈弹出两个数,符号栈弹出符号继续运算,结果入栈,再把扫描的当前运算符入栈
若大于直接入栈。 -
清空数栈和符号栈,依次弹出进行运算,每次运算结果入栈
-
代码实现:
package com.cwnu.stack;import java.util.Stack;/** 带有括号的表达式计算* */ /* 思路分析,对表达式继续扫描1. 如果是数字,直接放入数栈2. 如果是操作符2.1 判断符号栈是否为空,如果为空直接放入符号栈2.2 如果不为空,判断当前符号2.2.1 是否为括号,如果是"(",直接放入符号栈;如果是")",数栈弹出两个数,符号栈弹出符号继续运算,结果入栈,直到弹出的符号为"("2.2.2 是否为操作符,如果是则判断和栈顶符号的优先级,小于等于则数栈弹出两个数,符号栈弹出符号继续运算,结果入栈,再把扫描的当前运算符入栈若大于直接入栈。3.清空数栈和符号栈,依次弹出进行运算,每次运算结果入栈 */ public class CalculatorBrackets {public static void main(String[] args) {//声明两个栈(数栈,符号栈)Stack<Integer> numberStack = new Stack<>();Stack<String> operStack = new Stack<>();//声明字符串String express = "3 * ( ( 2 + 5 ) + 8 / ( 2 * 2 + 2 * 2 ) )";//将字符串转化为数组String[] strings = express.split(" ");//遍历数组字符串for (String itme : strings) {//首先判断是否为数字if (!isOper(itme)) {//表示位数字,直接入数栈System.out.println(itme);numberStack.push(Integer.valueOf(itme));} else {//判断栈是否为空,为空直接入栈if (operStack.isEmpty()) {operStack.push(itme);} else {//不为空if (itme.equals("(") || itme.equals(")")){//判断是否为括号if(itme.equals("(")){operStack.push(itme);}else {while (true){String oper = operStack.pop();if (oper.equals("(")){break;}int num1 = numberStack.pop();int num2 = numberStack.pop();numberStack.push(calculation(num1,num2,oper));}}}else {if (priority(itme) > priority(operStack.peek())) {operStack.push(itme);}else if (priority(itme) <= priority(operStack.peek())){System.out.println(operStack.peek());int num1 = numberStack.pop();int num2 = numberStack.pop();String oper = operStack.pop();numberStack.push(calculation(num1,num2,oper));operStack.push(itme);//当前符号栈进栈}}}}}int res;while (true) {if (numberStack.size() == 1) {res = numberStack.pop();break;}int num1 = numberStack.pop();int num2 = numberStack.pop();String oper = operStack.pop();numberStack.push(calculation(num1, num2, oper));}System.out.println("表达式计算结果为:" + res);}//判断是否为运算符public static boolean isOper(String e) {if (e.equals("*")){return true;}else if (e.equals("/")){return true;}else if (e.equals("+")){return true;}else if (e.equals("-")){return true;}else if (e.equals("(")){return true;}else if (e.equals(")")){return true;}else{return false;}}//计算public static int calculation(int num1, int num2, String e) {int res = 0;switch (e) {case "+":res = num1 + num2;break;case "*":res = num1 * num2;break;case "-":res = num2 - num1;break;case "/":res = num2 / num1;break;default:break;}return res;}//符号的优先级public static int priority(String e) {if (e.equals("*") || e.equals("/")) {return 1;} else if (e.equals("+") || e.equals("-")) {return 0;} else {return -1;}} }
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
