Java 如何确定表达式在堆栈中是否有平衡括号?

Java 如何确定表达式在堆栈中是否有平衡括号?,java,methods,stack,Java,Methods,Stack,所以我写了这段代码来确定一个表达式在堆栈中是否有平衡括号: public static boolean isBalanced(String expr) { StringStack stack = new StringStackRefBased(); try{ for (int i = 0; i<expr.length(); i++){ if (expr.charAt(i) == ('(')){ stack.push("(");

所以我写了这段代码来确定一个表达式在堆栈中是否有平衡括号:

public static boolean isBalanced(String expr) {
    StringStack stack = new StringStackRefBased();
    try{
    for (int i = 0; i<expr.length(); i++){
        if (expr.charAt(i) == ('(')){
            stack.push("(");
        } else if (expr.charAt(i) == (')')){
            stack.pop();
        }
    }
    if (stack.isEmpty()){
        return true;
        } else {
            return false;
        }
    } catch (StringStackException e) {
        return false;
    }
}

方法很好。如果我使用Java自己的堆栈:

class Main {

  public static boolean isBalanced(String expr) {
    Stack<String> stack = new Stack<>();
    try{
      for (int i = 0; i<expr.length(); i++){
        if (expr.charAt(i) == ('(')){
          stack.push("(");
        } else if (expr.charAt(i) == (')')){
          stack.pop();
        }
      }
      if (stack.isEmpty()){
        return true;
      } else {
        return false;
      }
    } catch (Exception e) {
      return false;
    }
  }

  public static void main(String[] args) {
    System.out.println(isBalanced("("));
    System.out.println(isBalanced("(()"));
    System.out.println(isBalanced("())"));
    System.out.println(isBalanced("((()))"));
    System.out.println(isBalanced("(()())"));
  }
}

方法很好。如果我使用Java自己的堆栈:

class Main {

  public static boolean isBalanced(String expr) {
    Stack<String> stack = new Stack<>();
    try{
      for (int i = 0; i<expr.length(); i++){
        if (expr.charAt(i) == ('(')){
          stack.push("(");
        } else if (expr.charAt(i) == (')')){
          stack.pop();
        }
      }
      if (stack.isEmpty()){
        return true;
      } else {
        return false;
      }
    } catch (Exception e) {
      return false;
    }
  }

  public static void main(String[] args) {
    System.out.println(isBalanced("("));
    System.out.println(isBalanced("(()"));
    System.out.println(isBalanced("())"));
    System.out.println(isBalanced("((()))"));
    System.out.println(isBalanced("(()())"));
  }
}

方法很好。如果我使用Java自己的堆栈:

class Main {

  public static boolean isBalanced(String expr) {
    Stack<String> stack = new Stack<>();
    try{
      for (int i = 0; i<expr.length(); i++){
        if (expr.charAt(i) == ('(')){
          stack.push("(");
        } else if (expr.charAt(i) == (')')){
          stack.pop();
        }
      }
      if (stack.isEmpty()){
        return true;
      } else {
        return false;
      }
    } catch (Exception e) {
      return false;
    }
  }

  public static void main(String[] args) {
    System.out.println(isBalanced("("));
    System.out.println(isBalanced("(()"));
    System.out.println(isBalanced("())"));
    System.out.println(isBalanced("((()))"));
    System.out.println(isBalanced("(()())"));
  }
}

方法很好。如果我使用Java自己的堆栈:

class Main {

  public static boolean isBalanced(String expr) {
    Stack<String> stack = new Stack<>();
    try{
      for (int i = 0; i<expr.length(); i++){
        if (expr.charAt(i) == ('(')){
          stack.push("(");
        } else if (expr.charAt(i) == (')')){
          stack.pop();
        }
      }
      if (stack.isEmpty()){
        return true;
      } else {
        return false;
      }
    } catch (Exception e) {
      return false;
    }
  }

  public static void main(String[] args) {
    System.out.println(isBalanced("("));
    System.out.println(isBalanced("(()"));
    System.out.println(isBalanced("())"));
    System.out.println(isBalanced("((()))"));
    System.out.println(isBalanced("(()())"));
  }
}


StringStack没有太多内容,但是StringStackRefBased包含了所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行
count++
count--
?最后,您可以检查计数是否为零。问题在于您的
StringStack
,因为如果我用Java的内置
堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。
isEmpty()
的实现与
push()
pop()
的实现不兼容。调用
push()
后,无论您调用
pop
多少次,head都不会为
null
。StringStack中没有太多内容,但StringStackRefBased中包含所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行
count++
count--
?最后,您可以检查计数是否为零。问题在于您的
StringStack
,因为如果我用Java的内置
堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。
isEmpty()
的实现与
push()
pop()
的实现不兼容。调用
push()
后,无论您调用
pop
多少次,head都不会为
null
。StringStack中没有太多内容,但StringStackRefBased中包含所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行
count++
count--
?最后,您可以检查计数是否为零。问题在于您的
StringStack
,因为如果我用Java的内置
堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。
isEmpty()
的实现与
push()
pop()
的实现不兼容。调用
push()
后,无论您调用
pop
多少次,head都不会为
null
。StringStack中没有太多内容,但StringStackRefBased中包含所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行
count++
count--
?最后,您可以检查计数是否为零。问题在于您的
StringStack
,因为如果我用Java的内置
堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。
isEmpty()
的实现与
push()
pop()
的实现不兼容。调用
push()
后,head永远不会
null
无论您调用
pop
@GriffeyDog多少次,问题在于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。对于push,我试图将旧头设置为前一个节点,并继续增加堆栈的大小。@GriffeyDog,问题是关于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。对于push,我试图将旧头设置为前一个节点,并继续增加堆栈的大小。@GriffeyDog,问题是关于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。对于push,我试图将旧头设置为前一个节点,并继续增加堆栈的大小。@GriffeyDog,问题是关于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。为了推动我,我正试着改变过去的想法
class StringStack {

  private StringNode head = null;

  public boolean isEmpty(){
    return head == null;
  }

  public void push(String item) {
    StringNode oldHead = head;
    head = new StringNode(item);
    head.next = oldHead;
  }

  public String pop() throws StringStackException {
    if (isEmpty()) {
      throw new StringStackException("Empty Stack");
    }
    String result = head.item;
    head = head.next;
    return result;
  }

  public String peek() throws StringStackException {
    if (isEmpty()) {
      throw new StringStackException("Stack underflow");
    }
    return head.item;
  }

  static class StringNode {

    String item;
    StringNode next;

    public StringNode(String item) {
      this.item = item;
    }
  }
}