字符串中四则运算表达式求值

字符串内容:1 + 2 * 5 - 6 / 2

写代码求出该字符串的值

 

class Main {
private static final Map<String, Integer> map = new HashMap<>();

private void initMap() {
map.put("+", 1);
map.put("-", 1);
map.put("*", 2);
map.put("/", 2);
}

public int cal(String str) {
if (str == null || str.length() == 0) {
return 0;
}
initMap();
Stack<Integer> numStack = new Stack<>();
Stack<String> opStack = new Stack<>();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == ' ') {
continue;
}
if (ch >= '0' && ch <= '9') {
sb.append(ch);
continue;
}
if (sb.length() > 0) {
numStack.push(Integer.valueOf(sb.toString()));
sb.delete(0, sb.length());
}
String op = String.valueOf(ch);
if (opStack.isEmpty()) {
opStack.push(op);
continue;
}
while (true) {
// 如果当前操作符是低级操作符,则把stack存的前面元素取出来计算。如果当前操作符的优先级比stack顶端操作符的更高,直接压入栈
if (helper(op, opStack.peek())) {
calFun(numStack, opStack);
if (opStack.isEmpty()) {
opStack.push(op);
break;
}
} else {
opStack.push(op);
break;
}
}
}

if (sb.length() > 0) {
numStack.push(Integer.valueOf(sb.toString()));
}
while (!opStack.empty()) {
calFun(numStack, opStack);
}
return numStack.pop();
}

private void calFun(Stack<Integer> numStack, Stack<String> opStack) {
String op = opStack.pop();
int var1 = numStack.pop();
int var2 = numStack.pop();
int result = 0;
switch (op) {
case "+":
result = var1 + var2;
break;
case "-":
result = var2 - var1;
break;
case "*":
result = var1 * var2;
break;
case "/":
result = var2 / var1;
break;
}
numStack.push(result);
}

private boolean helper(String op1, String op2) {
return map.get(op1) <= map.get(op2);
}

public static void main(String[] args) {
String s1 = "1 + 2 * 5 - 6 / 2";
Main main = new Main();
int res = main.cal(s1);
System.out.println(res);
}
}
posted @   MarkLeeBYR  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示