那我们只能用到栈了
首先定义一个空的栈
Stack<Character> stack = new Stack<Character>();
需要用到栈的思想, 不断将左括号推入栈中, 然后每次遇到一个右括号从栈中弹出一个左括号, 以此删除左侧并列关系的括号, 从而使每次计算左括号次数都只包含当前串联关系的左括号数量.
我们慢慢来看:
首先当我们输入((()()))
str.charAt(i) 在循环i的数值时 依次输出 1.( 2.( 3.( 4. ) 5. ( 6 . ) 7. ) 8. )
第一次循环是( 也就是 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了一个 左括号 (
继续执行语句:
maxVal = Math.max(maxVal, st.size());
maxVal我们前面定义了:
int maxVal = 0;
这样的话如果 括号是平行 的话 我们用此函数 深度就不会重复多加一了
详细说一下
继续执行 第二次循环 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了两个 左括号 ( (
继续执行下一条语句
maxVal = Math.max(maxVal, st.size());
继续执行语句:
maxVal = Math.max(maxVal, st.size());
继续执行 第三次循环 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了三个 左括号 ( ((
继续执行下一条语句
maxVal = Math.max(maxVal, st.size());
继续执行语句:
maxVal = Math.max(maxVal, st.size());
继续执行 第四次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 三个左括号 (((
现在减一个 (
那就是还有两个左括号 (( 此时st.size() 是2 因为有两个括号
继续执行 第五次循环 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了三个 左括号 ( (( 此时st.size() 是3 因为有3个括号
继续执行下一条语句
maxVal = Math.max(maxVal, st.size());
继续执行语句:
maxVal = Math.max(maxVal, st.size());
继续执行 第六次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 三个左括号 (((
现在减一个 (
那就是还有两个左括号 (( 此时st.size() 是2 因为有两个括号
继续执行 第7次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 2个左括号 ((
现在减一个 (
那就是还有1个左括号 (
继续执行 第8次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 1个左括号 (
现在减一个 (
那就是没有括号啦
结果也出来了
System.out.println(maxVal);