如何确定表达式是不是在堆栈中具有平衡括号? [复制]

Posted

技术标签:

【中文标题】如何确定表达式是不是在堆栈中具有平衡括号? [复制]【英文标题】:How do I determine if an expression has balanced brackets in a stack? [duplicate]如何确定表达式是否在堆栈中具有平衡括号? [复制] 【发布时间】:2015-05-21 20:08:18 【问题描述】:

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

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;
    

问题是,即使表达式有平衡括号,堆栈也会继续返回 false,所以我的代码有什么问题? 这是 StringStackRefBased 的代码

public class StringStackRefBased implements StringStack 
    private StringNode head;

    public boolean isEmpty()
        return head == null;
    

    public void push(String item) throws StringStackException
        head = new StringNode(item);
    

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

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

【问题讨论】:

好吧,StringStack 里面没有太多东西,但是 StringStackRefBased 里面有所有的方法。我更新了代码以显示 StringStackRefBased。我最想知道的是,push 和 pop 方法是否正确? 为什么不只使用一个 int 并执行 count++count--?然后最后你可以检查计数是否为零。 问题在于你的StringStack,因为如果我用Java内置的Stack替换它,它就可以正常工作了。 验证推送方式。我认为问题本身就存在。 您对isEmpty() 的实现与您对push()pop() 的实现不兼容。在调用push() 之后,无论你调用了多少次pop,head 都不会是null 【参考方案1】:

方法很好。如果我使用 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("(()())"));
  

将打印:

假
错误的
错误的
真的
真的

顺便说一句,您的 return 语句相当冗长,并且以这种方式使用异常是不好的做法。例外就是这样:一个例外(al case)。这比 IMO 更好:

public static boolean isBalanced(String expr) 
  Stack<String> stack = new Stack<>();

  for (int i = 0; i < expr.length(); i++) 
    if (expr.charAt(i) == ('('))
      stack.push("(");
    
    else if (expr.charAt(i) == (')')) 
      if (stack.isEmpty()) 
        return false;
      
      stack.pop();
    
  

  return stack.isEmpty();

这就是您的堆栈正常工作的方式:

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;
    
  

【讨论】:

@GriffeyDog,问题是关于他的方法(背后的逻辑),这很好。我只是向他展示了他需要查看他的筹码。如果他愿意提供他的堆栈的(完整)来源,我很乐意在我的回答中提供信息。 是的,我知道。同样,如果他提供该课程的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做)。 首先问题是我的推送和弹出方法无法正常工作,我不知道如何解决它们。对于推送,我正在尝试将旧头设置为前一个节点并继续增加堆栈的大小。

以上是关于如何确定表达式是不是在堆栈中具有平衡括号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何获得平衡括号之间的表达式

如何纠正正则表达式中的不平衡括号错误?

问题在于平衡括号。我正在使用堆栈进行操作。它不适用于仅一个测试用例,即')'。否则它工作正常

您将如何确定系统中的堆栈是向上还是向下增长? [复制]

使用堆栈检查括号/括号

括号匹配