码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode -- Basic Caculator

时间:2015-09-22 10:23:08      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:


Implement a basic calculator to evaluate a simple expression string.


The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .


You may assume that the given expression is always valid.


Some examples:
"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23


思路:
1. 两个栈,1个numStack存数字,1个opStack存(,),+,-
2. 解析数字过程中,注意数字可能是多位数
3. 如果是+,(,或-,直接入栈
4. 如果是),判断当前opStack最上操作符是否为‘(‘,如果是直接弹出(标记为弹出),如果opStack.Peek()不为‘(‘且opStack中有元素,则进行循环计算:
4.1 opStack弹出1个,numStack弹出2个,计算结果入numStack


4.2 最后判断,如果最上层为‘(‘且仍未弹出则弹出这个‘(‘


5.最后需要对余下opStack和numStack中的元素进行计算,结果入numStack(与4.1过程一样)


最后弹出numStack的结果即可。


实现代码:






public class Solution {
public int Calculate(string s) 
{
	// two stack
	var opStack = new Stack<string>();
	var numStack = new Stack<int>();
	var n = "";
	// if number , push number stack
	for(var i = 0;i < s.Length; i++){
		if(s[i] == ‘ ‘){
			continue;
		}
		
		// if (, +,- , push op stack
		if(s[i] == ‘(‘ || s[i] == ‘+‘ || s[i] == ‘-‘){
			opStack.Push(s[i].ToString());
		}
		// if ).  pop op stack, pop 2 from number stack, until reach ‘(‘
		else if(s[i] == ‘)‘){
			var poped = false;
			if(opStack.Count > 0 && opStack.Peek() == "("){
				poped = true;
				opStack.Pop();
			}
			
			while(opStack.Count > 0 && opStack.Peek() != "("){
				var n1 = numStack.Pop();
				var n2 = numStack.Pop();
				var o = opStack.Pop();
				numStack.Push(Calc(n1, n2, o));
			}
			if(!poped && opStack.Count > 0 && opStack.Peek() == "("){
				opStack.Pop();
			}
			
		}
		// push num into numStack, try calc until reach ‘(‘
		else
		{
			// parse out number 
			var valid = "0123456789";
			if(valid.Contains(s[i])){
				n += s[i];
				if(i == s.Length - 1 || !valid.Contains(s[i+1])){
					numStack.Push(int.Parse(n));
					n = "";
					while(opStack.Count > 0 && opStack.Peek() != "(")
					{
						var o = opStack.Pop();
						var n1 = numStack.Pop();
						var n2 = numStack.Pop();
						numStack.Push(Calc(n1,n2,o));
					}
					
				}
			}
		}
	}
	
	// pop the rest ops in opstack and numbers in number stack	
	while(opStack.Count > 0){
		var o = opStack.Pop();
		if(o != "+" && o != "-"){
			continue;
		}
		var n1 = numStack.Pop();
		var n2 = numStack.Pop();
		numStack.Push(Calc(n1,n2,o));
	}
	
	return numStack.Pop();
}
	
public int Calc(int n1, int n2, string op){
	switch(op)
	{
		case "+" :
			return n1 + n2;
		case "-" :
			return n2 - n1;
		default :
		throw new NotSupportedException();
	}
}


}


版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode -- Basic Caculator

标签:

原文地址:http://blog.csdn.net/lan_liang/article/details/48649985

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!