java实现逆波兰算法,Java数据结构和算法-逆波兰计算器分析和实现

package com.young.stack;

import com.sun.org.apache.xerces.internal.xs.LSInputList;

import java.util.ArrayList;

import java.util.List;

import java.util.Stack;

public class PolandNotation {

public static void main(String[] args) {

//先定义一个逆波兰表达式

//(3+4)x5-6 => 3 4 + 5 * 6 -

//(30+4)x5-6 => 30 4 + 5 * 6 -

//4*5-8+60+8/2 => 4 5 * 8 - 60 + 8 2 / +

//为了方便,逆波兰表达式的数字和符号使用空格隔开

String suffixExpression = "4 5 * 8 - 60 + 8 2 / +";

//思路

//1.先将"3 4 + 5 * 6 - " => 放到ArrayList中

//2.将ArrayList传递给一个方法,遍历ArrayList配合栈完成计算

List rpnList = getListString(suffixExpression);

System.out.println(rpnList);

int res = calculator(rpnList);

System.out.println("计算的结果是="+res);

}

//将一个逆波兰表达式,依次将数据和运算符放入到ArrayList中

public static List getListString(String suffixExpression) {

//将 suffixExpression 分割

String[] split = suffixExpression.split(" ");

List list = new ArrayList<>();

for (String ele : split) {

list.add(ele);

}

return list;

}

/**

* 完成对逆波兰表达式的运算

* 1. 从左至右扫描,将3和4压入堆栈;

* 2. 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈;

* 3. 将5入栈;

* 4. 接下来是x运算符,因此弹出5和7,计算出7*5=35,将35入栈;

* 5. 将6入栈;

* 6. 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

*/

public static int calculator(List ls) {

//创建一个栈,只需要一个栈即可

Stack stack = new Stack<>();

//遍历ls

for (String item : ls) {

//这是使用正则表达式来取出数

if (item.matches("\\d+")) {//匹配的是多位数

//入栈

stack.push(item);

} else {

//pop出两个数,并运算,再入栈

int num2 = Integer.parseInt(stack.pop());

int num1 = Integer.parseInt(stack.pop());

int res = 0;

if (item.equals("+")) {

res = num1 + num2;

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

res = num1 - num2;

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

res = num1 * num2;

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

res = num1 / num2;

} else {

throw new RuntimeException("运算符有误");

}

//res入栈

stack.push("" + res);

}

}

//最后留在stack中的数据是运算结果

return Integer.parseInt(stack.pop());

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值