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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值