📌  相关文章
📜  在不使用堆栈的情况下检查括号是否平衡

📅  最后修改于: 2021-05-04 09:08:16             🧑  作者: Mango

给定一个表达式字符串exp,编写一个程序来检查exp中“ {”,“}”,“(”,”)”,“ [”,“]]”的对和顺序是否正确。
例子:

Input : exp = “[()]{}{[()()]()}”
Output : true

Input : exp = “[(])”
Output : false


建议:在继续解决方案之前,请先在“实践”上解决它。

我们已经讨论了基于堆栈的解决方案。在这里,我们不允许使用堆栈。好像没有足够的空间就无法解决此问题(请参阅结尾处的注释)。我们使用递归来解决问题。
下面是上述算法的实现:

C++
// CPP program to check if parenthesis are
// balanced or not in an expression.
#include 
using namespace std;
 
char findClosing(char c)
{
    if (c == '(')
        return ')';
    if (c == '{')
        return '}';
    if (c == '[')
        return ']';
    return -1;
}
 
// function to check if parenthesis are
// balanced.
bool check(char expr[], int n)
{
    // Base cases
    if (n == 0)
        return true;
    if (n == 1)
        return false;
    if (expr[0] == ')' || expr[0] == '}' || expr[0] == ']')
        return false;
 
    // Search for closing bracket for first
    // opening bracket.
    char closing = findClosing(expr[0]);
 
    // count is used to handle cases like
    // "((()))".  We basically need to
    // consider matching closing bracket.
    int i, count = 0;
    for (i = 1; i < n; i++) {
        if (expr[i] == expr[0])
            count++;
        if (expr[i] == closing) {
            if (count == 0)
                break;
            count--;
        }
    }
 
    // If we did not find a closing
    // bracket
    if (i == n)
        return false;
 
    // If closing bracket was next
    // to open
    if (i == 1)
        return check(expr + 2, n - 2);
 
    // If closing bracket was somewhere
    // in middle.
    return check(expr + 1, i - 1) && check(expr + i + 1, n - i - 1);
}
 
// Driver program to test above function
int main()
{
    char expr[] = "[(])";
    int n = strlen(expr);
    if (check(expr, n))
        cout << "Balanced";
    else
        cout << "Not Balanced";
    return 0;
}


Java
// Java program to check if parenthesis are
// balanced or not in an expression.
import java.util.Arrays;
 
class GFG {
 
    static char findClosing(char c)
    {
        if (c == '(')
            return ')';
        if (c == '{')
            return '}';
        if (c == '[')
            return ']';
        return Character.MIN_VALUE;
    }
 
    // function to check if parenthesis are
    // balanced.
    static boolean check(char expr[], int n)
    {
        // Base cases
        if (n == 0)
            return true;
        if (n == 1)
            return false;
        if (expr[0] == ')' || expr[0] == '}' || expr[0] == ']')
            return false;
 
        // Search for closing bracket for first
        // opening bracket.
        char closing = findClosing(expr[0]);
 
        // count is used to handle cases like
        // "((()))". We basically need to
        // consider matching closing bracket.
        int i, count = 0;
        for (i = 1; i < n; i++) {
            if (expr[i] == expr[0])
                count++;
            if (expr[i] == closing) {
                if (count == 0)
                    break;
                count--;
            }
        }
 
        // If we did not find a closing
        // bracket
        if (i == n)
            return false;
 
        // If closing bracket was next
        // to open
        if (i == 1)
            return check(Arrays.copyOfRange(expr, i + 1, n), n - 2);
        // If closing bracket was somewhere
        // in middle.
        return check(Arrays.copyOfRange(expr, 1, n), i - 1) && check(Arrays.copyOfRange(expr, (i + 1), n), n - i - 1);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        char expr[] = "[(])".toCharArray();
        int n = expr.length;
        if (check(expr, n))
            System.out.println("Balanced");
        else
            System.out.println("Not Balanced");
    }
}
 
/* This code contributed by PrinciRaj1992 */


Python3
# Python3 program to check if parenthesis are
# balanced or not in an expression.
def findClosing(c):
    if c == '(':
        return ')'
    elif c == '{':
        return '}'
    elif c == '[':
        return ']'
    return -1
 
# function to check if parenthesis
# are balanced.
def check(expr, n):
 
    # Base cases
    if n == 0:
        return True
    if n == 1:
        return False
    if expr[0] == ')' or \
       expr[0] == '}' or expr[0] == ']':
        return False
 
    # Search for closing bracket for first
    # opening bracket.
    closing = findClosing(expr[0])
 
    # count is used to handle cases like
    # "((()))". We basically need to
    # consider matching closing bracket.
    i = -1
    count = 0
    for i in range(1, n):
        if expr[i] == expr[0]:
            count += 1
        if expr[i] == closing:
            if count == 0:
                break
            count -= 1
 
    # If we did not find a closing
    # bracket
    if i == n:
        return False
 
    # If closing bracket was next
    # to open
    if i == 1:
        return check(expr[2:], n - 2)
 
    # If closing bracket was somewhere
    # in middle.
    return check(expr[1:], i - 1) and \
           check(expr[i + 1:], n - i - 1)
 
# Driver Code
if __name__ == "__main__":
    expr = "[(])"
    n = len(expr)
 
    if check(expr, n):
        print("Balanced")
    else:
        print("Not Balanced")
 
# This code is conributed by
# sanjeev2552


C#
// C# program to check
// if parenthesis are
// balanced or not in
// an expression.
using System;
class GFG{
     
static char[] copyOfRange (char[] src,
                           int start,
                           int end)
{
  int len = end - start;
  char[] dest = new char[len];
  Array.Copy(src, start,
             dest, 0, len);
  return dest;
}
 
static char findClosing(char c)
{
  if (c == '(')
    return ')';
  if (c == '{')
    return '}';
  if (c == '[')
    return ']';
  return char.MinValue;
}
 
// Function to check if
// parenthesis are balanced.
static bool check(char []expr,
                  int n)
{
  // Base cases
  if (n == 0)
    return true;
  if (n == 1)
    return false;
  if (expr[0] == ')' ||
      expr[0] == '}' ||
      expr[0] == ']')
    return false;
 
  // Search for closing bracket for first
  // opening bracket.
  char closing = findClosing(expr[0]);
 
  // count is used to handle cases like
  // "((()))". We basically need to
  // consider matching closing bracket.
  int i, count = 0;
  for (i = 1; i < n; i++)
  {
    if (expr[i] == expr[0])
      count++;
    if (expr[i] == closing)
    {
      if (count == 0)
        break;
      count--;
    }
  }
 
  // If we did not find
  // a closing bracket
  if (i == n)
    return false;
 
  // If closing bracket
  // was next to open
  if (i == 1)
    return check(copyOfRange(expr,
                             i + 1, n),
                              n - 2);
  // If closing bracket
  // was somewhere in middle.
  return check(copyOfRange(expr, 1, n),
                           i - 1) &&
         check(copyOfRange(expr, (i + 1),
                           n), n - i - 1);
}
 
// Driver code
public static void Main(String[] args)
{
  char []expr = "[(])".ToCharArray();
  int n = expr.Length;
  if (check(expr, n))
    Console.WriteLine("Balanced");
  else
    Console.WriteLine("Not Balanced");
}
}
 
// This code is contributed by gauravrajput1


输出:
Not Balanced


与基于堆栈的解决方案相比,上述解决方案效率很低。这似乎仅对递归练习问题有用。