字符串中的表达式计算

字符串中的表达式计算

在这里插入图片描述
思路:

  1. 如果字符串中没有括号:

    每遇到一个字符,把它放进栈里(如果是数字字符,需要结合字符串将其转换成数字)。当一个数字进栈之前发现栈顶元素为*/,则连续弹出两次栈顶,计算该表达式的结果,并把结果放入栈中。

    这样做保证栈中的元素只有数字、+-,当字符串遍历完,计算栈中的表达式就行。

  2. 如果字符串中有括号:

    设计一个函数int[] value(String str, int index),该函数的作用是计算括号中的表达式。如果遇到一个左括号(,则执行函数value,传入参数str和左括号的下标加1。直到遇到右括号。函数返回一个数组arr,数组长度为2,arr[0]表示该括号内表达式的结果,arr[1]表示右括号的的下标+1,即继续执行计算的位置。

    每遇到一个左括号(都执行一次上述的递归运算。

import java.util.LinkedList;

public class Code_07_ExpressionCompute {

    //主函数
	public static int getValue(String str) {
		return value(str.toCharArray(), 0)[0];
	}

    //处理括号内的表达式
	public static int[] value(char[] str, int i) {
        //准备一个双向队列,用于存放无括号的字符
		LinkedList<String> que = new LinkedList<String>();
		int pre = 0;//处理字符串中的数字
		int[] bra = null;//返回结果
		while (i < str.length && str[i] != ')') {
			if (str[i] >= '0' && str[i] <= '9') {
				pre = pre * 10 + str[i++] - '0';
			} else if (str[i] != '(') {如果字符是+-*/
				addNum(que, pre);
				que.addLast(String.valueOf(str[i++]));
				pre = 0;
			} else {如果字符是(,递归调用vaule()
				bra = value(str, i + 1);
				pre = bra[0];
				i = bra[1] + 1;
			}
		}
		addNum(que, pre);
		return new int[] { getNum(que), i };
	}

    //处理没有括号的表达式,遇到*/先计算,计算结果放进栈
	public static void addNum(LinkedList<String> que, int num) {
		if (!que.isEmpty()) {
			int cur = 0;
			String top = que.pollLast();
			if (top.equals("+") || top.equals("-")) {
				que.addLast(top);
			} else {
				cur = Integer.valueOf(que.pollLast());
				num = top.equals("*") ? (cur * num) : (cur / num);
			}
		}
		que.addLast(String.valueOf(num));
	}

    //只用来处理栈中只有数字、+、-的情况
	public static int getNum(LinkedList<String> que) {
		int res = 0;
		boolean add = true;
		String cur = null;
		int num = 0;
		while (!que.isEmpty()) {
			cur = que.pollFirst();
			if (cur.equals("+")) {
				add = true;
			} else if (cur.equals("-")) {
				add = false;
			} else {
				num = Integer.valueOf(cur);
				res += add ? num : (-num);
			}
		}
		return res;
	}

	public static void main(String[] args) {
		String exp = "48*((70-65)-43)+8*1";
		System.out.println(getValue(exp));

		exp = "4*(6+78)+53-9/2+45*8";
		System.out.println(getValue(exp));

		exp = "10-5*3";
		System.out.println(getValue(exp));

		exp = "-3*4";
		System.out.println(getValue(exp));

		exp = "3+1*4";
		System.out.println(getValue(exp));

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值