栈Leetcode刷题

一个月前刷了leetcode上所有二叉树的简单的题目,一个月后自己还是在简单的范围内打转,烦死了,有很多东西并不会灵活的使用,今天来练习栈。
栈Leetcode刷题_第1张图片

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

逆波兰
栈Leetcode刷题_第2张图片
这一道题目中等比上一道简单多了。太夸张了吧。

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

你可能感兴趣的:(算法)