当前位置: 首页 > news >正文

LeetCode -- Basic Calculator II

题目描述:


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));
	}
}


相关文章:

  • 完整SQL分页存储过程(支持多表联接)
  • LeetCode -- Bitwise AND of Numbers Range
  • C 符号列表
  • LeetCode -- Linked List Cycle II
  • LeetCode -- LRU Cache
  • [Web 开发] 定制IE下载对话框的按钮(打开/保存)
  • LeetCode -- Min Stack
  • SQL2005CLR函数扩展-繁简转换
  • LeetCode -- Minimum Size Subarray Sum
  • LeetCode -- Number of 1 Bits
  • 对象属性拷贝(全匹配拷贝)
  • LeetCode -- Reorder List
  • 最近
  • LeetCode -- Search a 2D Matrix II
  • [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Android系统模拟器绘制实现概述
  • git 常用命令
  • isset在php5.6-和php7.0+的一些差异
  • js 实现textarea输入字数提示
  • JSONP原理
  • Otto开发初探——微服务依赖管理新利器
  • rc-form之最单纯情况
  • vue-loader 源码解析系列之 selector
  • 从伪并行的 Python 多线程说起
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端性能优化——回流与重绘
  • 延迟脚本的方式
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 数据可视化之下发图实践
  • ​力扣解法汇总946-验证栈序列
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #HarmonyOS:Web组件的使用
  • (26)4.7 字符函数和字符串函数
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (转)c++ std::pair 与 std::make
  • (转)Oracle存储过程编写经验和优化措施
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)(官方)UE4--图像编程----着色器开发
  • .Net mvc总结
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 常见的偏门问题
  • .NET 依赖注入和配置系统
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .netcore如何运行环境安装到Linux服务器
  • .NET连接MongoDB数据库实例教程
  • .net生成的类,跨工程调用显示注释
  • .Net小白的大学四年,内含面经
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • /etc/fstab和/etc/mtab的区别