[英]well formed string with special characters c#
如果輸入中的字符串由括號、方括號或大括號構成,我的程序需要輸出“true”
例子 :
Input : {([]){}()} ouput : true
Input : {L{}[{[a]}R]{2}} output : true
Input : {(}) output : false
Input : ][ output : false
訣竅是對齊,不計算打開和關閉的特殊字符。
是否有 Linq 或有條件的解決方案?
我們要確保正確使用()
和[]
和{}
。
我們使用堆棧。 當觀察到范圍開啟器時,它被放置在堆棧內。
當到達結束分隔符時,將比較堆棧的頂部元素。 如果堆棧為空,則此范圍終止符不匹配任何開啟符且字符串無效。
如果棧不為空,則將元素從棧頂移除,如果其類型與范圍終止符的類型相同,則繼續滾動。
到達字符串末尾后,棧必須為空,否則范圍不閉合,字符串無效。
bool ValidBraces(string infix)
{
bool valid = true;
int i = 0;
Stack<char> symbls = new Stack<char>();
while (i < infix.Length)
{
if (infix[i] == '(' || infix[i] == '[' || infix[i] == '{')
symbls.Push(infix[i]);
if (infix[i] == ')' || infix[i] == ']' || infix[i] == '}')
if (symbls.Count == 0)
{
valid = false;
break;
}
else
{
char ch = symbls.Pop();
switch(ch)
{
case '(':
if (')' != infix[i])
{
valid = false;
break;
}
break;
case '[':
if (']' != infix[i])
{
valid = false;
break;
}
break;
case '{':
if ('}' != infix[i])
{
valid = false;
break;
}
break;
}
}
i++;
}
if (symbls.Count > 0)
valid = false;
return valid;
}
測試代碼
string infix = "{L{}[{[a]}R]{2}}";
bool validate = ValidBraces(infix);
MessageBox.Show(validate.ToString());
infix = "][";
validate = ValidBraces(infix);
MessageBox.Show(validate.ToString());
如評論中所述,您可以使用堆棧來檢查右括號是否與打開的最后一個匹配。
bool IsSequenceValid(string value)
{
var openParenthesisStack = new Stack<char>();
var isValid = true;
using (var character = value.GetEnumerator())
while (isValid && character.MoveNext())
switch (character.Current)
{
case '(':
case '[':
case '{':
openParenthesisStack.Push(character.Current);
break;
case ')':
if (openParenthesisStack.Count == 0 || openParenthesisStack.Pop() != '(')
isValid = false;
break;
case ']':
if (openParenthesisStack.Count == 0 || openParenthesisStack.Pop() != '[')
isValid = false;
break;
case '}':
if (openParenthesisStack.Count == 0 || openParenthesisStack.Pop() != '{')
isValid = false;
break;
}
return isValid && openParenthesisStack.Count == 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.