一个月前刷了leetcode上所有二叉树的简单的题目,一个月后自己还是在简单的范围内打转,烦死了,有很多东西并不会灵活的使用,今天来练习栈。
public class Solution {
public int ScoreOfParentheses(string S)
{
//真鸡儿难,我看了官方答案
//栈记录了每一个深度的分数
Stack<int> stack = new Stack<int>();
stack.Push(0); //如果S==NUll,正好使用这个分数,到最后,栈内只会剩余一个答案
for(int i=0;i<S.Length;++i){
if(S[i]=='(')
{
stack.Push(0); //加入一个新的深度,当前深度的分值为0
}
else{
int v = stack.Pop(); //当前深度的分值
int lv = stack.Pop(); //上一个深度的分值
int nv = (v*2>0?2*v:1)+lv; //删除掉当前深度,重新计算上一个深度的分值,得到新值赋予过去
stack.Push(nv);
}
}
return stack.Pop();
}
}
逆波兰
这一道题目中等比上一道简单多了。太夸张了吧。
public class Solution {
private List<string> exps = new List<string>()
{
"+",
"-",
"*",
"/"
};
public int EvalRPN(string[] tokens)
{
Stack<string> stack = new Stack<string>();
for (int i = 0; i < tokens.Length; i++)
{
string s = tokens[i];
if(!exps.Contains(s))
{
stack.Push(s);
}
else
{
//计算新值
int.TryParse(stack.Pop(), out int b);
int.TryParse(stack.Pop(), out int a);
int c = Calc(a, b, s);
stack.Push(c.ToString());
}
}
int.TryParse(stack.Pop(), out int r);
return r;
}
private int Calc(int a,int b,string exp)
{
switch (exp)
{
case "+":
return a + b;
case "*":
return a * b;
case "-":
return a - b;
case "/":
return a / b;
}
return 0;
}
}