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、输入为字符串,由于有+-*/的存在,栈本身也应该是字符串。由于数组不方便增加删除,因此用ArrayList,动态数组;

2、输入如果为“数字”,则将该“数字”添加到ArrayList中,如果为加减乘除则从ArrayList中取出最后两个字符串并删除,转化为数字后计算值,将值重新压入ArrayList;

3、测试,不通过,提示用例为只有一个数字时返回错误。检查发现return的是计算后的value,当只有一个数字输入时只有压栈没有出栈,因此错误。正确的做法是返回ArrayList中的值。


总结:

1、如果网站没给出测试用例的话,可能debug的要吐血才能发现这个问题。写测试用例考虑边界情况确实是一门学问。

2、用C写比较麻烦,因为没有动态数组,需自己写一个带指针的数组数组,指向当前的栈的位置。可以考虑下如何写。



public class Solution {
    public int evalRPN(String[] tokens) {
    	final String expression ="+-*/";
		int value = 0;
		int index = -1;
		List<String> list = new ArrayList<String>();
		for(String s: tokens){
			index = expression.indexOf(s);
			if(index < 0){
				list.add(s);
			}else{
				switch (index) {
				case 0:value = Integer.parseInt(list.get(list.size()-2))
								+Integer.parseInt(list.get(list.size()-1));
					break;
				case 1:value = Integer.parseInt(list.get(list.size()-2))
								-Integer.parseInt(list.get(list.size()-1));
					break;
				case 2:value = Integer.parseInt(list.get(list.size()-2))
								*Integer.parseInt(list.get(list.size()-1));
					break;
				case 3:value = Integer.parseInt(list.get(list.size()-2))
								/Integer.parseInt(list.get(list.size()-1));
					break;
					
				default:
					break;
				}
				list.remove(list.size()-1);
				list.remove(list.size()-1);
				list.add(String.valueOf(value));	
			}
			index = -1;		
		}
		return Integer.valueOf(list.get(0));
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值