java栈实现表达式求值_【Java】栈实现表达式求值

示例:3 + 4 * 3 + ( 5 - 1) #

解题思路:

本题的难度在于如何区分优先级实现四则运算

首先定义两个栈:操作数栈用来存储操作数,操作符栈用来存储操作符

表达式的求值关键点在于运算符号的优先级,当当前符号的优先级大于栈顶的符号时,直接入栈;若当前符号小于栈顶,则计算当前操作数栈顶的两个元素;若等于,则栈顶符号出栈

优先级的定义看代码

代码:

package practise;

import java.io.IOException;

import java.util.Stack;

public class EvaluateExpression {

// 定义两个栈

private static Stack stackOpr = new Stack<>();

private static Stack stackNum = new Stack<>();

// 计算表达式

public static void main(String [] args) throws IOException {

char c = (char)System.in.read();

stackOpr.push('#');

while(c != '#' || stackOpr.peek() != '#'){

if(isNum(c)){

stackNum.push(c - 48);

c = (char)System.in.read();

}else{

switch(isPrior(c)){

case '

int a = stackNum.pop();

int b = stackNum.pop();

stackNum.push(operation(b, a, stackOpr.pop()));

break;

case '>':

stackOpr.push(c);

c = (char)System.in.read();

break;

case '=':

stackOpr.pop();

c = (char)System.in.read();

break;

}

}

}

System.out.println(stackNum.pop());

}

// 判断字符的优先级

static char isPrior(char c){

char c1 = stackOpr.peek();

if(c == '+' || c == '-'){

if(c1 == '+' || c1 == '-' || c1 == '*' || c1 == '/' || c1 == ')')

return '

if(c1 == '(' || c1 == '#')

return '>';

}

if(c == '*' || c == '/'){

if(c1 == '*' || c1 == '/' || c1 == ')')

return '

if(c1 == '+' || c1 == '-' || c1 == '#' || c1 == '(')

return '>';

}

if(c == '('){

return '>';

}

if(c == ')'){

if(c1 == '(')

return '=';

else

return '

}

if(c == '#'){

if(c1 == '#')

return '=';

else

return '

}

return 0;

}

// 计算当前表达式

static int operation(int a, int b, char c){

switch(c){

case '+':

return a + b;

case '-':

return a - b;

case '*':

return a * b;

case '/':

return a / b;

}

return 0;

}

// 判断是否为数字

static boolean isNum(char c){

if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c =='#'){

return false;

}

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
思路: 1. 定义两个,一个用于存储运算符,一个用于存储操作数; 2. 从左到右遍历中缀表达式中的每个字符; 3. 如果当前字符是数字,则直接压入操作数; 4. 如果当前字符是左括号,则直接压入运算符; 5. 如果当前字符是右括号,则不断弹出运算符中的元素,直到遇到左括号为止,将弹出的运算符与对应的操作数进行计算,将计算结果压入操作数; 6. 如果当前字符是运算符,则不断弹出运算符中优先级大于等于当前运算符的元素,将弹出的运算符与对应的操作数进行计算,将计算结果压入操作数,最后将当前运算符压入运算符; 7. 遍历完成后,依次弹出运算符中的元素,进行计算,直到运算符为空,最后操作数中剩下的元素即为表达式的计算结果。 代码实现: ```java import java.util.*; public class InfixEvaluation { // 判断是否为运算符 private static boolean isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 获取运算符的优先级 private static int getPriority(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } // 计算表达式 private static int evaluate(int a, int b, char operator) { switch (operator) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } // 中缀表达式求值 public static int evaluateInfix(String expression) { Stack<Integer> operands = new Stack<>(); // 操作数 Stack<Character> operators = new Stack<>(); // 运算符 for (int i = 0; i < expression.length(); i++) { char c = expression.charAt(i); if (Character.isDigit(c)) { // 如果是数字,直接入 int num = c - '0'; while (i < expression.length() - 1 && Character.isDigit(expression.charAt(i + 1))) { num = num * 10 + expression.charAt(i + 1) - '0'; i++; } operands.push(num); } else if (c == '(') { // 如果是左括号,直接入 operators.push(c); } else if (c == ')') { // 如果是右括号,不断弹出运算符中的元素,直到遇到左括号为止 while (operators.peek() != '(') { char operator = operators.pop(); int b = operands.pop(); int a = operands.pop(); int result = evaluate(a, b, operator); operands.push(result); } operators.pop(); // 弹出左括号 } else if (isOperator(c)) { // 如果是运算符 while (!operators.empty() && getPriority(operators.peek()) >= getPriority(c)) { char operator = operators.pop(); int b = operands.pop(); int a = operands.pop(); int result = evaluate(a, b, operator); operands.push(result); } operators.push(c); } } while (!operators.empty()) { // 弹出运算符中的元素,进行计算 char operator = operators.pop(); int b = operands.pop(); int a = operands.pop(); int result = evaluate(a, b, operator); operands.push(result); } return operands.pop(); // 返回操作数中的元素,即为表达式的计算结果 } public static void main(String[] args) { String expression = "3+4*5-(6+7)*8/2"; int result = evaluateInfix(expression); System.out.println(expression + " = " + result); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值