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

LeetCode -- Evaluate Reverse Polish Notation

题目描述:


Evaluate the value of an arithmetic expression in Reverse Polish Notation.


Valid operators are +, -, *, /. Each operand may be an integer or another expression.


Some examples:
  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6




算是一个经典题目,就是执行一个逆波兰表达式。


思路:
1. 使用操作符栈,操作数栈。
解析tokens的过程中,如果token[i]是操作符:
a. 操作数栈中没有元素,操作符入栈
b. 操作数栈有元素,弹出最上两个与该操作符计算,结果入操作数栈


2. 如果token[i]操作数,直接入操作数栈
3. 如果解析完毕后,操作符栈还有操作符,一一弹出并计算(弹1个操作符,两个操作数),结果入操作符栈
4. 弹出操作符栈的最后元素,即为计算结果。



public class Solution {
    public int EvalRPN(string[] tokens) 
    {
        var stNo = new Stack<int>();
    	var stOp = new Stack<char>();
    	
    	for(var i = 0;i < tokens.Length; i++){
    		if(IsOp(tokens[i])){
    			if(stNo.Count == 0){
    				stOp.Push(tokens[i][0]);
    			}
    			else{
    				var n1 = stNo.Pop();
    				var n2 = stNo.Pop();
    				stNo.Push(Calc(n1, n2, tokens[i][0]));
    			}
    		}
    		else{
    			stNo.Push(int.Parse(tokens[i]));
    		}
    	}
	


    	while(stOp.Count > 0){
    		var op = stOp.Pop();
    		var n1 = stNo.Pop();
    		var n2 = stNo.Pop();
    		stNo.Push(Calc(n1, n2, op));
    	}
    	
    	return stNo.Pop();
    }


private int Calc(int n1 , int n2, char op)
{
	switch(op)
	{
		case '+':
			return n2 + n1;
		case '-':
			return n2 - n1;
		case '*':
			return n2 * n1;
		case '/':
			return n2 / n1;
		default:
			throw new NotSupportedException();
	}
}


private bool IsOp(string str)
{
	if(str == "+" || str == "-" || str == "*" || str == "/")
	{
		return true;
	}
	
	return false;
}
}


相关文章:

  • [Web开发] 微软的 PHP+IIS+WinServer 开发培训资料/示例代码
  • LeetCode -- Jump Game
  • 好,是没有尽头的
  • LeetCode -- Palindrome Partitioning
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • LeetCode -- Pow(x, n)
  • (ZT)出版业改革:该死的死,该生的生
  • LeetCode -- Rectangle Area
  • 推荐一个做“台”的思路
  • LeetCode -- Reverse Nodes in k-Group
  • LeetCode -- Binary Search Tree Iterator
  • 使用pgRouting进行路径分析
  • LeetCode -- Combination Sum III
  • 怎样使用深度纹理
  • LeetCode -- Expression Add Operators
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【Linux系统编程】快速查找errno错误码信息
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • golang中接口赋值与方法集
  • JavaScript类型识别
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • RxJS: 简单入门
  • 力扣(LeetCode)56
  • 利用jquery编写加法运算验证码
  • 批量截取pdf文件
  • 让你的分享飞起来——极光推出社会化分享组件
  • 源码安装memcached和php memcache扩展
  • 终端用户监控:真实用户监控还是模拟监控?
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • postgresql行列转换函数
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • !!java web学习笔记(一到五)
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (14)Hive调优——合并小文件
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)hibernate配置管理
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)php新闻发布平台 毕业设计 141646
  • (译) 函数式 JS #1:简介
  • (转载)Linux网络编程入门
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET中GET与SET的用法
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @Async注解的坑,小心
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [04] Android逐帧动画(一)
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [BJDCTF2020]The mystery of ip1