首页 > 解决方案 > 检查表达式 C# 中的平衡括号

问题描述

希望你过得很好。我一直在努力处理这段代码。我认为这必须有效,但我无法准确地看到我有错误的问题(我就像盲人)。
你能帮忙吗....提前谢谢。两个字符串都返回 FALSE。但首先必须是 TRUE。

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class PatternFinder : MonoBehaviour
{
    public void Check()
    {
        String test_good = "()(){}{}{()}";//this must return TRUE
        String test_bad = "((({}{}))()";//this must return FALSE

        Debug.Log(checkBalanced(test_good));
        Debug.Log(checkBalanced(test_bad));
    }

    public static bool checkBalanced(String check)
    {
        Stack<char> stack = new Stack<char>();
        for (int i = 0; i < check.Length; i++)
        {
            char character = check[i];
            if (character == '[' || character == '{' || character == '(')
                stack.Push(character);
            else if (character == ']' || character == '}' || character == ')')
            {
                if (stack.Any())
                    return false;
                switch (character)
                {
                    case ']':
                        if (stack.Pop() != '[')
                            return false;
                        break;
                    case '}':
                        if (stack.Pop() != '{')
                            return false;
                        break;
                    case ')':
                        if (stack.Pop() != '(')
                            return false;
                        break;
                    default:
                        break;
                }
            }
        }
        if (stack.Any())
            return true;
        return false;
    }
}

标签: c#algorithmstack

解决方案


输入此 if 语句后,您不需要 stack.Any() 。它会导致您过早地从函数中返回。因为如果堆栈中有任何内容而不删除任何内容,它就存在该函数。

        else if (character == ']' || character == '}' || character == ')')
        {
            if (stack.Any()) // you don't want this here
                return false; 

在从堆栈中弹出任何内容之前拥有 stack.Any() 在那里没有任何目的,因为您想遍历字符串直到找到不匹配的字符串。

相反,你应该有!stack.Any()因为如果堆栈是空的并且你有一个结束字符,那么它是不平衡的。

public static bool checkBalanced(String check)
{
    Stack<char> stack = new Stack<char>();
    for (int i = 0; i < check.Length; i++)
    {
        char character = check[i];
        if (character == '[' || character == '{' || character == '(')
            stack.Push(character);
        else if (character == ']' || character == '}' || character == ')')
        {
            if (!stack.Any()) // if stack is empty and you have a closing character this means that it is unbalanced 
                return false;
            switch (character)
            {
                case ']':
                    if (stack.Pop() != '[')
                        return false;
                    break;
                case '}':
                    if (stack.Pop() != '{')
                        return false;
                    break;
                case ')':
                    if (stack.Pop() != '(')
                        return false;
                    break;
                default:
                    break;
            }
        }
    }
    // it is balanced only if there aren't any left
    if (!stack.Any())
        return true;
    return false;
}

推荐阅读