C#检查表达式是否有效

C#检查表达式是否有效,c#,syntax,stack,arithmetic-expressions,C#,Syntax,Stack,Arithmetic Expressions,表达方式: “(a[i]+{-1}*(8-9))” 应该返回true,因为这样编写语法是有效的。每个左括号都在正确的位置有一个右闭合器,所有括号都位于合法位置。 我试图通过一个堆栈来实现这一点,我知道我错在哪里,但我想知道解决这个问题的相关方法。 谢谢! 我可怜的错误代码: string expression=“(a[i]+{-1}*(8-9))”; Stack expStack=新堆栈(); List rightBracketsHolder=新列表(); for(int i=0;i

表达方式:

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

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

string expression=“(a[i]+{-1}*(8-9))”;
Stack expStack=新堆栈();
List rightBracketsHolder=新列表();
for(int i=0;i
此代码将解决您的问题-

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 ' ';
        }
    }
static void Main(字符串[]args)
{
布尔误差=假;
var str=“(a[i]+{-1}*(8-9))”;
堆栈=新堆栈();
foreach(str.ToCharArray()中的变量项)
{
如果(项目=='('| |项目=='{'| |项目=='[')
{
堆栈。推送(项目);
}
如果(item==')'| | item=='}'| | item==']'),则为else
{
if(stack.Peek()!=GetComplementBracket(项目))
{
错误=真;
打破
}
}
}
如果(错误)
Console.WriteLine(“不正确的括号”);
其他的
控制台。WriteLine(“括号很好”);
Console.ReadLine();
}
私有静态字符(字符项)
{
开关(项目)
{
案例“)”:
返回“(”;
案例“}”:
返回“{”;
案例']':
返回“[”;
违约:
返回“”;
}
}

此代码将解决您的问题-

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 ' ';
        }
    }
static void Main(字符串[]args)
{
布尔误差=假;
var str=“(a[i]+{-1}*(8-9))”;
堆栈=新堆栈();
foreach(str.ToCharArray()中的变量项)
{
如果(项目=='('| |项目=='{'| |项目=='[')
{
堆栈。推送(项目);
}
如果(item==')'| | item=='}'| | item==']'),则为else
{
if(stack.Peek()!=GetComplementBracket(项目))
{
错误=真;
打破
}
}
}
如果(错误)
Console.WriteLine(“不正确的括号”);
其他的
控制台。WriteLine(“括号很好”);
Console.ReadLine();
}
私有静态字符(字符项)
{
开关(项目)
{
案例“)”:
返回“(”;
案例“}”:
返回“{”;
案例']':
返回“[”;
违约:
返回“”;
}
}

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

我还使用了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;
   }
}
使用系统;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
字符串表达式=“(a[i]+{-1}*(8-9))”;
bool stackResult=checkValidity(表达式);
if(stackResult)
WriteLine(“表达式有效”);
其他的
Console.WriteLine(“\n表达式无效”);
}
私有静态bool checkValidity(字符串表达式)
{
Stack openStack=新堆栈();
foreach(表达式中的字符c)
{
开关(c)
{
案例“{”:
格“(”:
案例“[”:
openStack.Push(c);
打破
案例“}”: