LeetCode -- Basic Calculator II

原创 2015年11月21日 09:54:29
题目描述:


Implement a basic calculator to evaluate a simple expression string.


The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.


You may assume that the given expression is always valid.


Some examples:
"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5


就是对1个表达式解析出操作数和操作符,做四则运算,但不包括括号。


思路:
1. 去除空白字符
2. 考虑多位数字的情况
3. 如果是'*'或'/',直接计算;否则入栈
4. 由于只剩下加减运算符了,按顺序计算出结果即可。




实现代码:



public int Calculate(string s)
{
	var exp = s.Where(c => c != ' ').ToList();
	
	var stackOp = new Stack<char>();
	var stackNum = new Stack<int>();
	
	var ops = new []{'+','-','*','/'};
	
	var n = "";
	for(var i = 0;i < exp.Count; i++){
		if(ops.Contains(exp[i])) // detected operator
		{
			stackOp.Push(exp[i]);
		}
		else{
			// parse the number
			for(var j = i;j < exp.Count; j++){
				if(!ops.Contains(exp[j])){
					n += exp[j];
				}
				else{
					break;
				}
			}
			
			var n1 = int.Parse(n);
			// if top is '*' or '/' , immediately calculate
			if(stackOp.Count > 0 && (stackOp.Peek() == '*' || stackOp.Peek() == '/')){
				var n2 = stackNum.Pop();
				stackNum.Push(Calc(n2, n1, stackOp.Pop()));
			}
			else{
				stackNum.Push(n1);
			}
			
			i += n.Length - 1;
			n = "";
		}
	}
	
	// since now we only left '+' and '-'
	// we should reverse the order (both operators and numbers) back to where they were
	var stackOp1 = stackOp.Reverse();
	var stackNum1 = new Stack<int>(stackNum);
	var count = 0;
	
	foreach(var op in stackOp1){
		var n1 = stackNum1.Pop();
		var n2 = stackNum1.Pop();
		
		stackNum1.Push(Calc(n1 , n2, op));
		count += 2;
	}
	
	return stackNum1.Pop();
}


private int Calc(int n1 , int n2, char op)
{
	switch(op){
		case '+':
			return n1 + n2;
		case '-':
			return n1 - n2;
		case '*':
			return n1 * n2;
		case '/':
			return n1 / n2;
		default :
		throw new ArgumentException(string.Format("unexpected operator : {0}", op));
	}
}


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

leetcode 227: Basic Calculator II

Implement a basic calculator to evaluate a simple expression string. The expression string contai...
  • summer_liuwei
  • summer_liuwei
  • 2015年10月24日 11:49
  • 1059

【LeetCode】Basic Calculator && Basic Calculator II

1、Basic Calculator  Total Accepted: 3726 Total Submissions: 24053 My Submissions Question Solution  ...
  • u013027996
  • u013027996
  • 2015年06月24日 11:01
  • 3483

BASIC语言五十周年:怀念当年风华正茂的APPLE-II主机

关于APPLEII比较齐全的资料。包括APPLEII机模拟器、APPLEII的PASCAL开发工具、以及FC主机的FBASIC、GBASIC等。APPLEII模拟器自带最早的带行号的BASIC语言开发...
  • ephesians
  • ephesians
  • 2014年10月08日 15:13
  • 537

【LeetCode-面试算法经典-Java实现】【113-Path Sum II(路径和)】

【113-Path Sum II(路径和II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a binary tree and a sum, find al...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月12日 06:23
  • 2529

LeetCode Basic Calculator(用栈计算表达式的值)

题意:给出一个计算表达式,只包含 +,-,(,),求计算结果 思路:用栈来实现  代码如下: public class Solution { private int cal(int nu...
  • wuli2496
  • wuli2496
  • 2016年07月21日 20:34
  • 215

Basic Calculator (非常重要)

227. Basic Calculator II Implement a basic calculator to evaluate a simple expression string. The...
  • gao1440156051
  • gao1440156051
  • 2016年08月13日 17:46
  • 219

买卖股票的最佳时机I II III IV

买卖股票的最佳时机I II III IV I假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。II假设有一...
  • u010669349
  • u010669349
  • 2017年12月22日 22:47
  • 34

Leetcode 454. 4Sum II 四数之和2 解题报告

1 解题思想首先,这是一道远古之前的题的进化版: Leetcode #18 4Sum 四数之和 解题小节+K-Sum思想 但是我不想说那个题了,因为我也记不住了。。这道题意思就是ABCD四个数组,长...
  • MebiuW
  • MebiuW
  • 2016年11月16日 22:45
  • 2796

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

1.问题描述  写一个高效的算法,从一个m×nm\times n的整数矩阵中查找出给定的值,矩阵具有如下特点:    每一行从左到右递增。 每一列从上到下递增。 2. 方法与思路2.1 二分查找法 ...
  • Jeanphorn
  • Jeanphorn
  • 2015年07月23日 20:41
  • 3119

【LeetCode-面试算法经典-Java实现】【219-Contains Duplicate II(包含重复元素II)】

【219-Contains Duplicate II(包含重复元素II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月29日 06:36
  • 3296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode -- Basic Calculator II
举报原因:
原因补充:

(最多只允许输入30个字)