表达式求值

http://www.lintcode.com/zh-cn/problem/expression-evaluation/

给一个用字符串表示的表达式数组,求出这个表达式的值。

样例

对于表达式 (2*6-(23+7)/(1+2)), 对应的数组为:

[
  "2", "*", "6", "-", "(",
  "23", "+", "7", ")", "/",
  (", "1", "+", "2", ")"
],

其值为 2

思路:用两个栈分别保存操作数和操作符。每当遇到操作符时,进行检测,若操作符栈为空或栈顶元素的优先级比当前操作符低,直接入栈,否则弹出栈顶操作符和两个操作数计算,再把结果压入操作数栈中。继续检查,直至操作符栈为空或栈顶元素的优先级比当前操作符低

代码:


class Solution {
    /**
     * @param expression: an array of strings;
     * @return: an integer
     */
    public static int evaluateExpression(String[] expression) {
        // write your code here
        if(expression==null||expression.length==0)
            return 0;
        Stack<String> nums = new Stack<String>();
        Stack<String> symbols = new Stack<String>();
		String str=null;
        for(int i=0;i<expression.length;++i){
            str = expression[i];
            if(str.equals("*")||str.equals("/")){
                while(!symbols.empty()&&(symbols.peek().equals("/")||symbols.peek().equals("*")))
					calc(nums,symbols);
				symbols.push(str);
            }else if(str.equals(")")){
				while(!symbols.peek().equals("("))
					calc(nums,symbols);
				symbols.pop();
            }else if(str.equals("+")||str.equals("-")){
                while(!(symbols.empty()||symbols.peek().equals("(")))
					calc(nums,symbols);
				symbols.push(str);
            }else if(str.equals("(")){
                symbols.push("(");
            }else{
                nums.push(str);
            }
        }
        while(!symbols.empty())
		    calc(nums,symbols);
		if(nums.empty())
		    return 0;
		else
            return Integer.parseInt(nums.peek());
    }
	public static void calc(Stack<String> nums, Stack<String> symbols){
		int left,right,result=0;
		String str = null;
		if(!symbols.empty()){
			str = symbols.pop();
			right = Integer.parseInt(nums.pop());
			left = Integer.parseInt(nums.pop());
			if(str.equals("+")){
				result = right+left;
			}else if(str.equals("-")){
				result = left - right;
			}else if(str.equals("*")){
				result = right*left;
			}else if(str.equals("/")){
				result = left/right;
			}
			nums.push(String.valueOf(result));
		}
		
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值