使用 Stack 检查括号是否平衡?

Checking if parenthesis are balanced or not using Stack?

我写了一个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;
    }
}
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,如果适合您,您可以跳过对剩余字符串的迭代。

这部分是错误的:

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

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

如果不使用每个括号,仅使用表达式长度的不同方法怎么样?这将使您不使用 Stack class 并且对于更长的表达式

应该更有效
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;
}

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

#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");
}
}