表达式求值

// 双栈算法求表达式的值,一个栈存放操作数,一个存放操作符

// 遇到)或者低优先级(或相等)则对前面的运算进行处理:操作数栈弹出两个元素,操作符栈弹出一个元素,运算结果压入操作数栈;

// 结束条件:操作符栈为空


package bishi;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class MyExpression {

	public static void calcu(Stack datas, Stack ops) {
		// 后弹出的放在右边
		int b = (Integer) datas.pop();
		int a = (Integer) datas.pop();

		char op = (Character) ops.pop();

		if ('+' == op) {
			datas.push(a + b);
		} else if ('-' == op) {
			datas.push(a - b);
		} else if ('*' == op) {
			datas.push(a * b);
		} else {
		}
	}

	public static void main(String[] args) {
		// 假定操作数为1位数,操作符为+,-,*,(,),中间没有空格等其他字符
		String str = "3*(7-2*3)+5";
		char[] cc = str.toCharArray();// 转为字符数组

		Map<Character, Integer> mapbias = new HashMap<Character, Integer>();// 操作符的优先级
		mapbias.put('(', 0);// 低优先级
		mapbias.put('+', 1);
		mapbias.put('-', 1);
		mapbias.put('*', 2);// 高优先级运算

		Stack<Integer> datas = new Stack<Integer>();
		Stack<Character> ops = new Stack<Character>();

		for (int i = 0; i < cc.length; i++) {
			if (cc[i] >= '0' && cc[i] <= '9') {// 假定操作数是1位数
				datas.push(cc[i] - '0');// 字符转整数,压栈
			} else if (cc[i] == '(') {
				ops.push(cc[i]);
			} else if (cc[i] == ')') {
				while ((Character) ops.peek() != '(') {
					calcu(datas, ops);
				}
				ops.pop();
			} else {// +,-,*
				while (ops.isEmpty() == false
						&& (Integer) mapbias.get(cc[i]) <= (Integer) mapbias.get(ops.peek())) {// 当前操作符的优先级小于(相等)ops栈顶操作符的优先级,则进行运算,直到高于ops栈顶操作符的优先级
					calcu(datas, ops);
				}
				ops.push(cc[i]);// 压入当前操作符
			}
		}

		while (ops.isEmpty() == false) {
			calcu(datas, ops);
		}
		System.out.println(datas.pop());
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值