欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Leetcode - 有效的括号

程序员文章站 2022-06-17 19:49:10
...

Leetcode - 有效的括号
解题思路:(C#)
利用栈先进后出的原则,先将满足括号左半部分的都加到栈内,当遇到右半部分的时候进行判断,若和栈顶元素是“一对”则删除栈顶元素,若不同则将右半部分加到栈内;此处利用到的是括号的对称性,不管相对“对称点”在哪里或者能凑成对的两个部分距离多远,只要遇到能“配成一对”的就消除,不能的话就加进去,最后站内元素不为空的时候说明字符串无效。

public class Solution {
    public bool IsValid(string s) {
        string left = "{([";
        string right = "})]";

        if (string.IsNullOrEmpty(s))
        {
            return true;
        }

        if (left.IndexOf(s[0]) < 0 || s.Length%2 == 1)
        {
            return false;
        }

        Stack<char> stack = new Stack<char>();

        foreach (var item in s)
        {
            if (left.IndexOf(item) >= 0)
            {
                stack.Push(item);
            }
            else if (item == ')')
            {
                if(stack.Peek() == '(')
                {
                    stack.Pop();
                }
                else
                {
                    stack.Push(item);
                }
            }
            else if (item == ']')
            {
                if (stack.Peek() == '[')
                {
                    stack.Pop();
                }
                else
                {
                    stack.Push(item);
                }
            }
            else if (item == '}')
            {
                if (stack.Peek() == '{')
                {
                    stack.Pop();
                }
                else
                {
                    stack.Push(item);
                }
            }
        }

        return stack.Count == 0;
    }
}

Leetcode - 有效的括号

要点

  • 栈(stack)是限定在表的一端进行插入和删除操作的线性表,又称为后进先出的线性表,简称FILO(first in last out)。插入元素称为入栈,删除元素称为出栈。通常将允许出栈的一端称为栈顶(top),则另一端称为栈底(bottom)。不含元素的栈称为空栈。

  • 栈的基本操作

  1. 初始化一个栈
  2. 判断是否是空栈
  3. 判断是否是满栈
  4. 进栈
  5. 出栈
  6. 取栈顶元素
  7. 求当前栈元素个数
  • Stack.Peek 与 stack.Pop 的区别

相同点:返回栈顶的值。

不同点:Stack.Peek不改变栈的值(不删除栈顶的值),pop会把栈顶的值删除。

  • Stack.Add()与Stack.Push()的区别

相同点:插入栈的顶端。

不同点:push()方法返回值描述:Returns:the item argument;而add()方法的返回值描述:Returns:true(as specified by Collection.add),也就是会返回true或者false。

  1. Stack.Push()的插入位置:Pushes an item onto the top of this stack.
  2. Stack.Add()的插入位置:Appends the specified element to the end of this Vector.
  3. 显然,在插入位置上,Stack.Push()方法插入stack的顶端,而Stack.Add()方法是插入在vector的底端。
  4. 这里有个逻辑反转的问题:因为vector和stack的实现方式同样是数组,所以在Stack.Add()类似于添加在数组的底端,stack的出入策略是后进先出,也就是vector的底端也就相当于是stack的顶端。
  5. stack有添加元素自己的方法Stack.Push();但是在操作过程中发现,Stack.Add()同样可以添加元素至stack。stack本身没有Stack.Add()方法,但是继承的类vector有add方法,同时,vector的父类和实现接口List也有add()方法。
  • C#的var类型

传统定义变量是已知变量的类型,如: int a = 1; string b = “q”;用Var类型预先不用知道变量的类型,根据你给变量赋值来判定变量属于什么类型。如:var a =1; 则a是整型,var a = “q”;则a是字符型。
但使用Var类型要注意:

  1. 必须在定义时初始化,即不能先定义后初始化,如:var a;a = 1;这样是不允许的。
  2. 一旦初始化完成,不能再给变量赋与初始化不同的变量。
  3. var类型的变量必须是局部变量。
  • indexOf()的用法
    Leetcode - 有效的括号
相关标签: Leetcode练习