逆波兰式计算器 java_后缀表达式(逆波兰表达式)计算器

packagedatastructure.stack;import java.util.*;/***

netty_lecture

*

逆波兰计算器

* 1+((2+3)*4)-5 ==> 1 2 3 + 4 * + 5 1

*@author: myron

* @date : 2020-03-18 23:48

**/

public classPolandNotation {private static final int MINAS = 0;private static final int PLUS = 0;private static final int MULTI = 1;private static final int DIV = 1;public static voidmain(String[] args){

String expression= "1,+,(,(,200,+,3,),*,9,),-,5";

List list =middleExpressionToList(expression);

List suffixExp =middleExpToSuffixExp(list);

System.out.println("中缀表达式:"+list);

System.out.println("后缀表达式:" +suffixExp);int result =calculate(suffixExp);

System.out.println("结果为:" +result);

}/*** 中缀表达式转List

*@paramexpression

*@return

*/

public static ListmiddleExpressionToList(String expression){

String[] split= expression.split(",");

List list =Arrays.asList(split);returnlist;

}/*** 中缀表达式转后缀表达式list

*@parammiddleExpList

*@return

*/

public static List middleExpToSuffixExp(ListmiddleExpList){

Stack s1 = new Stack<>();

List s2 = new ArrayList<>();for(String oper:middleExpList){int priority =getPriority(oper);if(oper.matches("\\d+")){

s2.add(oper);

}else if("(".equals(oper)) {

s1.push(oper);

}else if(")".equals(oper)){while(!"(".equals(s1.peek())){

s2.add(s1.pop());

}

s1.pop();

}else{while(s1.size() != 0 && priority <=getPriority(s1.peek())){

s2.add(s1.pop());

}

s1.push(oper);

}

}while(s1.size() != 0){

s2.add(s1.pop());

}returns2;

}/*** 计算方法

*@paramlist :后缀表达式

*@return

*/

public static int calculate(Listlist){//创建栈

Stack stack = new Stack<>();//遍历表达式list

for(String str: list){/**正则匹配,是数字,入栈*/

if(str.matches("\\d+")){

stack.push(str);/**运算符,则弹出两位数,进行运算*/}else{int num1 =Integer.parseInt(stack.pop());int num2 =Integer.parseInt(stack.pop());int result = 0;if(str.equals("+")){

result= num1 +num2;

}else if(str.equals("-")){

result= num2 -num1;

}else if(str.equals("*")){

result= num1 *num2;

}else if(str.equals("/")){

result= num2/num1;

}else{throw new RuntimeException("不支持该符号!");

}//预算结果入栈

stack.push(result + "");

}

}//返回运算结果

returnInteger.parseInt(stack.pop());

}/*** 获取符号的优先级*/

public static intgetPriority(String oper){if (oper.equals("+")) {returnPLUS;

}else if(oper.equals("-")){returnMINAS;

}else if(oper.equals("*")){returnMULTI;

}else if(oper.equals("/")){returnDIV;

}return -1;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值