c# - 检查表达式 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;
}
}
解决方案
输入此 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;
}
推荐阅读
- c - 当我给出论点时,execlp 不起作用
- git - 持续集成 - 突破性变化
- javascript - React native Android Generate Signed APK 给出资源错误
- amazon-web-services - 在 AWS 中,嵌套安全组适用于负载均衡器
- excel - 将工作表复制到多个工作簿时更改参考
- python - Matplotlib - savefig 在以透明度保存时忽略 facecolor
- django - 如何将 Django 文件从本地机器更新到 Ubuntu 开发服务器(AWS EC2)?
- javascript - iframe 定义为 null
- python - Python - 基于“x”转推数转推的 Twitter 机器人
- node.js - 使用 vue 和套接字获取数据