Leetcode - 有效的括号
程序员文章站
2022-06-17 19:49:10
...
解题思路:(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;
}
}
要点:
-
栈(stack)是限定在表的一端进行插入和删除操作的线性表,又称为后进先出的线性表,简称FILO(first in last out)。插入元素称为入栈,删除元素称为出栈。通常将允许出栈的一端称为栈顶(top),则另一端称为栈底(bottom)。不含元素的栈称为空栈。
-
栈的基本操作
- 初始化一个栈
- 判断是否是空栈
- 判断是否是满栈
- 进栈
- 出栈
- 取栈顶元素
- 求当前栈元素个数
- 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。
- Stack.Push()的插入位置:Pushes an item onto the top of this stack.
- Stack.Add()的插入位置:Appends the specified element to the end of this Vector.
- 显然,在插入位置上,Stack.Push()方法插入stack的顶端,而Stack.Add()方法是插入在vector的底端。
- 这里有个逻辑反转的问题:因为vector和stack的实现方式同样是数组,所以在Stack.Add()类似于添加在数组的底端,stack的出入策略是后进先出,也就是vector的底端也就相当于是stack的顶端。
- 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类型要注意:
- 必须在定义时初始化,即不能先定义后初始化,如:var a;a = 1;这样是不允许的。
- 一旦初始化完成,不能再给变量赋与初始化不同的变量。
- var类型的变量必须是局部变量。
- indexOf()的用法