算法-栈

20230212,窗外一直下雨,那就静下心来好好学习(保证做事要有思路),做点好吃的。

一 学习算法的步骤:

1.模拟:模拟题目的运行
2.规律:尝试总结出题目的一般规律和特点
3.匹配:找到符合这些特点的数据结构和算法
4.边界:考虑特殊情况
5.画图。

二 案例: 判断一个括号字符串是否有效 

一个括号字符串是只由 '(' 和 ')' 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:

字符串为 ().
字符串()()(())

 请你返回 true ,否则返回 false 。

2.1 模拟

 

 

 2.2 规律

  1)每个左括号(或者右括号)都要完成匹配,才是合法的

  2)配对可通过消除法来消掉合法的括号,如果最后没有任何字符,就是合法字符

  3)奇数长度字符串总是非法的

2.3 匹配

  可以用栈来解决问题

2.4 边界

  1)字符串为空

  2)字符串只有一个或者奇数个

  3)字符串是“((()))”嵌套很多层的是否可以处理

2.5 画图

  

 

 

三 编码验证 

static bool IsValid(string s) {
    // 当字符串为空,可以快速返回true
    if (string.IsNullOrWhiteSpace(s))
    {
        return true;
    }
    // 当字符串长度为奇数,可以快速返回false
    if (s.Length % 2 == 1)
    {
        return false;
    }

    Stack<char> stack = new Stack<char>();
    foreach (char c in s)
    {
        // 如果是 ’(‘,进栈
        if (c == '(')
        {
            stack.Push(c);
        }
        // 如果是 ’)‘,出栈
        else if (c == ')') {
            // 栈为空,出栈失败,返回false
            if (!stack.Any())
            {
                return false;
            }
            else
            {
                stack.Pop();
            }
        }
    }
    // 最后栈为空,则返回true,否则返回false
    if (!stack.Any())
    {
        return true;
    }
    else { 
        return false;
    }
}

  

 

posted @ 2023-02-12 11:48  vba是最好的语言  阅读(23)  评论(0编辑  收藏  举报