分隔符使用堆栈检查

时间:2016-02-19 08:18:41

标签: java stack delimiter

代码检查字符串中的分隔符是否平衡。我一直在使用堆栈来解决这个问题。我遍历字符串到最后,每当遇到一个开口分隔符时我将它推入堆栈,对于遇到的每个结束分隔符我检查堆栈是否为空(如果是,则报告错误)然后弹出堆栈以匹配弹出的字符和结束的分隔符遇到。我忽略了字符串中的所有其他字符。 在遍历结束时,我检查堆栈是否为空(即检查所有打开的分隔符是否均衡)。如果它不为空,我会报告错误。 虽然我已多次交叉检查,但代码似乎是将每个字符串报告为invaalid(即使用不平衡分隔符)。这是代码:

import java.util.*;
public class delimiter {
    public static void main(String args[]){
        String s1 = "()";
        String s2 = "[}[]";
        if(delimitercheck(s1)){
            System.out.println("s1 is a nice text!");
        }
        else
            System.out.println("S1 is not nice");
        if(delimitercheck(s2)){
            System.out.println("s2 is a nice text!");
        }
        else
            System.out.println("S2 is not nice");
    }
    public static boolean delimitercheck(String s){
        Stack<Character> stk = new Stack<Character>();
        if(s==null||s.length()==0)//if it's a null string return true
            return true;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
                stk.push(s.charAt(i));
            }
            if(s.charAt(i)==')'||s.charAt(i)=='}'||s.charAt(i)==']'){
                if(stk.isEmpty()){
                    return false;
                }
                if(stk.peek()==s.charAt(i)){
                    stk.pop();
                }
            }
        }
        if(stk.isEmpty()){
            return true;
        }
        else
            return false;
    }
}

有人能指出我哪里出错了?

3 个答案:

答案 0 :(得分:2)

您的错误在这里:

            if(stk.peek()==s.charAt(i)){
                stk.pop();
            }

i'字符不应等于stk.peek()。它应该关闭它。即如果stk.peek() == '{'s.charAt(i)应为'}',依此类推。

此外,如果当前右括号与堆栈顶部不匹配,则应返回false。

您可以为每种类型的paretheses设置单独的条件,或者您可以创建一个Map<Character,Character>,将每个左括号映射到相应的右括号,然后您的条件将变为:

            if(map.get(stk.peek())==s.charAt(i)){
                stk.pop();
            } else {
                return false;
            }

其中map可以初始化为:

Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('{','}');
map.put('[',']');

答案 1 :(得分:0)

是的,当遇到一个右括号时,检查它是否与开启括号相似,这是不正确的。

if(stk.peek()==s.charAt(i)){
    stk.pop();
}

应替换为与

类似的内容
Character toCheck = s.charAt(i);
Character peek = stk.peek();

if (toCheck == ')') {
    if (peek == '(') {
        stk.pop();
    } else {
        return false;
    }
} else if ( // ... check all three bracket types

并且坚持每个 if的括号 - 声明 - 没有什么比乏味因为省略括号而遇到错误更乏味了这将导致你更多的内部疼痛。

答案 2 :(得分:0)

您正在检查堆栈值,该堆值具有带有结束分隔符的开始分隔符。因此,对于第一个示例,您正在检查&#39;(&#39; with&#39;)&#39;。相反,对于每个相应的结束分隔符,您应该检查堆栈的起始分隔符,即&#39;(&#39; with&#39;)&#39;。希望这是有道理的。