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

本文介绍了使用Java栈实现表达式求值的方法,通过维护两个栈分别存储操作数和操作符,结合运算符优先级进行计算。代码示例中详细展示了如何处理不同运算符和优先级,最终从操作数栈中获取计算结果。
摘要由CSDN通过智能技术生成

c90cadccf06ff6fb04b20ae3486314e8.png

解题思路:

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

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

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

优先级的定义看代码

代码:

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值