题目
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
c#
思路
本题是直接参考的解析,并自己理解清楚的。本题利用while循环,来处理给定数组中元素是运算符还是数字,利用int.TryParse()语句,该语句的用法如下:
int y=0;
int Num;
if(int .TryParse("9",out y))
{
Num=y;//如果"9"不能转化为int类型,if里的表达式为false,如果转化成功就赋给变量y; 然后我们就可以无限次使用y帮我们取值啦,(*^__^*) 嘻嘻…… int.TryParse的最大好处是再也不用担心类型转化时报错了;
}
//除了int.TryParse(),相信大家已经想到了 ,同理,还有 decimal.TryParse() 等等;
在每一次循环中得到一个运算符,并将距离该运算符最近的两个数字元素存储到栈中,并直接对其进行运算,然后处理过的数据及运算符就直接出栈,最后返回得到最终的运算结果。
public class Solution {
public int EvalRPN(string[] tokens) {
Stack<int> stack=new Stack<int>();
int i=0;
while(i<tokens.Length)
{
int temp=0;
if(int.TryParse(tokens[i],out temp))//判断给定的数组元素中读取的此时的元素是否为int类型,如果是就将其值传递给中间变量temp,否则结果为false
{
stack.Push(temp);//把int类型的元素插入建立的栈中
}
else
{
var value2=stack.Pop();
var value1=stack.Pop();
if(tokens[i]=="+")
{
stack.Push(value1+value2);
}
else if(tokens[i]=="-")
{
stack.Push(value1-value2);
}
else if(tokens[i]=="*")
{
stack.Push(value1*value2);
}
else if(tokens[i]=="/")
{
stack.Push(value1/value2);
}
}
i++;
}
return stack.Pop();
}
}