【问题标题】:C# checking if expression is brackets valid [closed]C#检查表达式是否是有效的括号[关闭]
【发布时间】:2016-08-14 00:49:32
【问题描述】:

表达式:

"(a[i]+{-1}*(8-9))"

应该返回 true,因为这样编写语法是有效的。每个左括号都有一个正确的位置,并且所有括号都在合法位置。
我试图通过一个堆栈来做到这一点,我知道我错在哪里,但我想知道解决这个问题的相关方法。 谢谢!
我可怜可怜的错误代码:

            string expression = "( a[i]+{-1}*(8-9) ) ";
        Stack<char> expStack = new Stack<char>();
        List<char> rightBracketsHolder = new List<char>();
        for (int i = 0; i < expression.Length; i++)
        {
            if (expression[i] == '{')
            {
                expStack.Push('}');
                Console.Write("}" + " ");
            }
            else if (expression[i] == '(')
            {
                expStack.Push(')');
                Console.Write(")" + " ");
            }
            else if (expression[i] == '[')
            {
                expStack.Push(']');
                Console.Write("]" + " ");
            }
        }
        Console.WriteLine();
        for (int i = 0; i < expression.Length; i++)
        {
            if (expression[i] == '}')
            {
                rightBracketsHolder.Add('}');
                Console.Write(expression[i] + " ");
            }
            else if (expression[i] == ')')
            {
                rightBracketsHolder.Add(')');
                Console.Write(expression[i] + " ");
            }
            else if (expression[i] == ']')
            {
                rightBracketsHolder.Add(']');
                Console.Write(expression[i] + " ");
            }
        }
        Console.WriteLine();
        bool stackResult = checkValidity(expStack, rightBracketsHolder);
        if (stackResult)
            Console.WriteLine("Expression is Valid.");
        else
            Console.WriteLine("\nExpression is not valid.");
        Console.ReadKey();
    }

    private static bool checkValidity(Stack<char> expStack, List<char> leftBracketsHolder)
    {
        Console.WriteLine();
        int length = leftBracketsHolder.Count;
        for (int i = 0; i < length; i++)
        {
            if (expStack.Peek().ToString().Contains(leftBracketsHolder.ToString()))
            {
                leftBracketsHolder.Remove(expStack.Peek());
                expStack.Pop();

            }
        }
        if (expStack.Count == 0 && leftBracketsHolder.Count ==0)
        {
            return true;
        }
        return false;
    }
}

【问题讨论】:

  • 我认为你应该使用算术表达式解析器。看看这个question

标签: c# syntax stack arithmetic-expressions


【解决方案1】:

此代码将解决您的目的 -

static void Main(string[] args)
    {
        bool error = false;
        var str = "( a[i]+{-1}*(8-9) )";
        Stack<char> stack = new Stack<char>();
        foreach (var item in str.ToCharArray())
        {
            if (item == '(' || item == '{' || item == '[')
            {
                stack.Push(item);
            }
            else if(item == ')' || item == '}' || item == ']')
            {
                if (stack.Peek() != GetComplementBracket(item))
                {
                    error = true;
                    break;
                }
            }
        }

        if (error)
            Console.WriteLine("Incorrect brackets");
        else
            Console.WriteLine("Brackets are fine");
        Console.ReadLine();
    }

    private static char GetComplementBracket(char item)
    {
        switch (item)
        {
            case ')':
                return '(';
            case '}':
                return '{';
            case ']':
                return '[';
            default:
                return ' ';
        }
    }

【讨论】:

    【解决方案2】:

    当关闭发生时,您需要将东西从堆栈中弹出。试试下面的代码。它将在堆栈上推送一个左大括号/括号/括号,然后第一件事将通过相应的关闭从堆栈中弹出。否则无效。如果遇到关闭时堆栈上没有打开,则它是无效的。如果您完成后有任何额外的打开,则无效。

    我还使用了 switch 语句而不是 if 语句,只是因为我认为它更易于阅读。

    using System;
    using System.Collections.Generic;
    
    public class Program
    {
       public static void Main()
       {
          string expression = "( a[i]+{-1}*(8-9) ) ";
          bool stackResult = checkValidity(expression);
    
          if (stackResult)
             Console.WriteLine("Expression is Valid.");
          else
             Console.WriteLine("\nExpression is not valid.");
       }
    
       private static bool checkValidity(string expression)
       {
          Stack<char> openStack = new Stack<char>();
          foreach (char c in expression)
          {
             switch (c)
             {
                case '{':
                case '(':
                case '[':
                   openStack.Push(c);
                   break;
                case '}':
                   if (openStack.Count == 0 || openStack.Peek() != '{')
                   {
                      return false;
                   }
                   openStack.Pop();       
                   break;
                case ')':
                   if (openStack.Count == 0 || openStack.Peek() != '(')
                   {
                      return false;
                   }
                   openStack.Pop();       
                   break;
                case ']':
                   if (openStack.Count == 0 || openStack.Peek() != '[')
                   {
                      return false;
                   }
                   openStack.Pop();       
                   break;
                default:
                   break;
             }
          }
          return openStack.Count == 0;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多