逆波兰表达式算法 java_java实现逆波兰表达式算法

import java.util.ArrayList;

import java.util.List;

public class MyStack {

private List l;

private int size;

public String top;

public MyStack() {

l = new ArrayList();

size = 0;

top = null;

}

public int size() {

return size;

}

public void push(String s) {

l.add(s);

top = s;

size++;

}

public String pop() {

String s = l.get(size - 1);

l.remove(size - 1);

size--;

top = size == 0 ? null : l.get(size - 1);

return s;

}

}

import java.util.ArrayList;

import java.util.List;

public class Nbl {

private static MyStack ms1 = new MyStack();//生成逆波兰表达式的栈

private static MyStack ms2 = new MyStack();//运算栈

/**

* 将字符串转换为中序表达式

*/

public static List zb(String s) {

List ls = new ArrayList();//存储中序表达式

int i = 0;

String str;

char c;

do {

if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {

ls.add("" + c);

i++;

} else {

str = "";

while (i < s.length() && (c = s.charAt(i)) >= 48

&& (c = s.charAt(i)) <= 57) {

str += c;

i++;

}

ls.add(str);

}

} while (i < s.length());

return ls;

}

/**

* 将中序表达式转换为逆波兰表达式

*/

public static List parse(List ls) {

List lss = new ArrayList();

for (String ss : ls) {

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

lss.add(ss);

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

ms1.push(ss);

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

while (!ms1.top.equals("(")) {

lss.add(ms1.pop());

}

ms1.pop();

} else {

while (ms1.size() != 0 && getValue(ms1.top) >= getValue(ss)) {

lss.add(ms1.pop());

}

ms1.push(ss);

}

}

while (ms1.size() != 0) {

lss.add(ms1.pop());

}

return lss;

}

/**

* 对逆波兰表达式进行求值

*/

public static int jisuan(List ls) {

for (String s : ls) {

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

ms2.push(s);

} else {

int b = Integer.parseInt(ms2.pop());

int a = Integer.parseInt(ms2.pop());

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

a = a + b;

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

a = a - b;

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

a = a * b;

} else if (s.equals("\\")) {

a = a / b;

}

ms2.push("" + a);

}

}

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

}

/**

* 获取运算符优先级

* +,-为1 *,/为2 ()为0

*/

public static int getValue(String s) {

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

return 1;

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

return 1;

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

return 2;

} else if (s.equals("\\")) {

return 2;

}

return 0;

}

public static void main(String[] args) {

System.out.println(jisuan(parse(zb("0-8+((1+2)*4)-3+(2*7-2+2)"))));

}

}

开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明java实现逆波兰表达式算法!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值