【问题标题】:Checking if parenthesis are balanced or not using Stack?检查括号是否平衡或不使用堆栈?
【发布时间】:2016-06-26 09:45:36
【问题描述】:

我写了一个java代码来测试一个表达式是否平衡,即这个程序检查字符'(','{'和'['是否有相应的分隔符。但是我无法得到所需的答案。出了点问题,我无法弄清楚,因此需要您的帮助。这是代码。

package z_Stack_InfixToPostfix;
import java.util.Stack;

public class Driver_InfixToPostfix {

    public static void main(String[] args) {
        String s="(a+b)";
        System.out.println(checkBalance(s));
    }

    public static boolean checkBalance(String expression){
        boolean isBalanced=true;
        Stack<Character> myStack=new Stack<Character>();
        int length=expression.length();
        int i=0;
        while(isBalanced && i<length){
            switch(expression.charAt(i)){
            case '(': case '{': case '[' :
                myStack.push(expression.charAt(i));
                break;
            case ')': case '}': case ']':
                if(myStack.isEmpty()){
                    isBalanced=false;
                }
                else{
                    char opendelimiter=myStack.pop();
                    if(opendelimiter!=expression.charAt(i)){
                        isBalanced=false;
                    }
                }
                break;
            }
            i++;
        }
        if(!myStack.isEmpty()){
            isBalanced=false;
        }
        return isBalanced;
    }
}

【问题讨论】:

  • There is something wrong - 你能给出一个输出不是你期望的示例输入吗?
  • 我在 main 方法中给出了一个示例输入。是(a+b)。它应该是平衡的,我的 checkBalance 方法应该返回 true,但我一直在得到 false。
  • 您希望([}]得到什么答案?
  • @shmosel 是假的吧?它将'('和'['添加到堆栈中,当它遇到'}'时,它将进入我的switch语句中的第二组案例,因为'['和'{'不相等,isBalanced将是设置为 false 并退出循环对吗?
  • @rohitkrishna094,其实不然。您的代码没有区分任何类别的分隔符。尽管正如一些答案所解释的那样,这也许是if(opendelimiter!=expression.charAt(i)) 的意图。

标签: java stack expression parentheses balance


【解决方案1】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


char exp[1028];
char ext[1028];

int top = -1;
//-----------------------------------------------------------------------------
push(char x){

    top++;
    ext[top]=x;
    }
//-----------------------------------------------------------------------------------------

void pop(){
    top--;
}
//--------------------------------------------------------------------------------------


main()
{
int ans;
char in='{';
char it='[';
char ie='(';

char an;'}';
char at=']';
char ae=')';
printf("\nenter your expression\n");
gets(exp);
int j=strlen(exp);
int i;
for(i=0;i<=j;i++){
    if(exp[i] == in || exp[i] == it || exp[i]==ie){
        push(exp[i]);
        }
    if(exp[i] == an ||exp[i]== at || exp[i]==ae){
        pop();
    }
}
if(top == -1){
    printf("\nexp is balanced\n");
    }
else{
    printf("\nexp is unbalanced");
}
}

【讨论】:

    【解决方案2】:

    如果只使用表达式的长度而不使用每个括号,那么另一种方法呢?这将使您不使用 Stack 类,并且对于更长的表达式应该更有效

    public static boolean checkBalance(String expression) {
       String[] parentheses = new String[]{"\\(|\\)","\\[|\\]","\\{|\\}"};
       int length = expression.length();
       for(int i=0; i<parentheses.length; i++) {
           int newLength = expression.replaceAll(parentheses[i], "").length();
           int diff = length - newLength;
           if(diff % 2 != 0) {
              return false;
           }
       }
       return true;
    }
    

    双反斜杠用于转义每个括号,因为它们是特殊字符

    【讨论】:

      【解决方案3】:
      char opendelimiter=myStack.pop();
      if(opendelimiter!=expression.charAt(i)){
             isBalanced=false;
      }
      

      这里你应该检查

          if(openedDeimilter == '('){
              if(expression.charAt(i)!=')'){
                  isBalanced=false;
                  //break;
              }
          }else if(openedDeimilter == '['){
              if(expression.charAt(i)!=']'){
                 isBalanced=false;
                 //break;
              }
          }else {
               if(expression.charAt(i)!='}'){
                  isBalanced=false;
                  //break;
              }
          }
      

      此外,一旦 isBalanced 设置为 false,如果适合您,您可以跳过对剩余字符串的迭代。

      【讨论】:

        【解决方案4】:

        在第二个 case 语句中,您将 "(" 与 ")" 进行比较,这始终是错误的,您的布尔值也是如此。

        所以你要比较正确的对应字符!

        【讨论】:

          【解决方案5】:

          这部分错了:

          if(opendelimiter!=expression.charAt(i)){
              isBalanced=false;
          }
          

          您检查两个字符是否相等,但正确的检查应该匹配两个对应的字符:[ - ]( - ){ - }

          【讨论】:

            猜你喜欢
            • 2017-06-10
            • 1970-01-01
            • 2016-09-06
            • 2022-08-13
            • 2019-11-01
            • 2022-01-02
            • 2014-04-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多