合法括号序列的定义是:
1.空序列是合法括号序列。
2.如果S是合法括号序列,那么(S)是合法括号序列。
3.如果A和B都是合法括号序列,那么AB是合法括号序列。
输入格式
输入一行,长度为N的括号序列S(0<=N<=50000,S只包括()这2种字符)
输出格式
输出一行,1表示括号序列合法,0表示括号序列不合法
输入样例
(())(
输出样例
0
有题目我们可以知道思路大概是:
我们把他简单的分为 2 类,左括号和右括号。其中左括号包括: ([{ ,右括号包括: )]} 。
一个合法的表达式,需要满足每一个左括号作为开始,都有与其匹配的右括号作为结束。
于是我们想到一个简单的判断方法,统计整个表达式中,每种括号出现的次数,如果成对的括号数量不相同,则不合法,否则合法。
这个方法的问题在于遇到这种不合法的序列 ))(( ,无法有效处理。
我们使用一种成对消除的思路来解决这个问题。
当计算机接受了一个左括号后,那么他后面合法的符号有 4 种, 可以是 3 种左括号中的任意一种,也可以是与他配对的右括号。
如果是左括号,则当前括号不是马上需要处理的括号了,问题转为处理下一个左括号。
当计算机接受了一个右括号,那么,这个右括号必须与之前的左括号匹配,否则序列就是非法的。
此处理过程与栈的特点相吻合,由此,在算法中设置一个栈,每读入一个括号,若是左括号则放在栈顶,等待与后面的右括号匹配,若是右括号,则判断与栈顶的括号是否匹配,不匹配则不合法(如果栈是空的,也是一种不匹配)。另外在算法结束的时候,栈应该是空的,
合法括号序列 V1
最新推荐文章于 2023-03-26 20:28:01 发布