Swift 如何改进检查括号是否平衡的程序?
我已经编写了一个示例程序来检查括号是否平衡。我试图优化它,这是我能想到的最好的。然而,我正在寻找,如果我们可以进一步改善这一点。我也不确定这是否是一个关于stackoverflow的有效问题。有什么想法和建议吗Swift 如何改进检查括号是否平衡的程序?,swift,data-structures,stack,Swift,Data Structures,Stack,我已经编写了一个示例程序来检查括号是否平衡。我试图优化它,这是我能想到的最好的。然而,我正在寻找,如果我们可以进一步改善这一点。我也不确定这是否是一个关于stackoverflow的有效问题。有什么想法和建议吗 func checkBalancedParenthesis(parenthesis: String) -> (Bool,String) { var stack = Stack<Character>() for character in parenth
func checkBalancedParenthesis(parenthesis: String) -> (Bool,String) {
var stack = Stack<Character>()
for character in parenthesis.characters {
guard let check = try? checkValidPattern(a: ("!",character)) else {
return (false,"Pattern is not valid")
}
if let elem = stack.top, try! checkValidPattern(a: (elem,character)) {
stack.pop()
}
else {
stack.push(item: character)
}
}
return (stack.isEmpty,stack.isEmpty ? "Balanced": "Un-Balanced")
}
func checkValidPattern(a: (Character,Character)) throws -> Bool {
let validList: [Character] = ["(",")","[","]","}","{","<",">"]
switch a
{
case ("(",")"):
return true
case ("[","]"):
return true
case ("{","}"):
return true
case ("<",">"):
return true
case let (_,char) where validList.contains(char) == true:
return false
default:
throw InvalidPattern.chracterNotValid
}
}
我得到了你真正需要的东西。可以使用for循环检查序列中的每个字符。将每个左括号追加到新数组中。对于每个闭合支架,检查新阵列中的最后一个支架是否为闭合支架对应的开口支架,然后拆下开口支架。将其保留到数组末尾,检查数组是否为空。列举类型安全性的括号。您可以在CodeReview中查看此链接以了解更多代码 也许我的解决方案对某人有用。检查支架的平衡,或仅检查支架的平衡。 func使用匹配字符或字符串(如果需要大小写)获取字符串和dict,并返回isBalancedBool。斯威夫特34 对于Swift 4:str.字符替换为str 这是: 用法:
如果括号是平衡的,那是什么意思?括号是一个单数名词。如果您的程序按预期工作,并且您正在寻找审查和可能的改进,那么codereview.stackexchange.com就是正确的站点。请注意,如果您决定在代码审查站点发布此文章,请删除此文章。谢谢大家@马丁纳,谢谢你指向链接。我想这就是我想要的。计数不足以检测到“[{]}”不平衡。是的,你是对的。需要的远不止这些。我也在codereview中找到了完美swift解决方案的链接。也许我可以在将来为其他人添加链接。
func isBalanced(str: String, dictAccordance: [Character : Character]) -> Bool {
var balArr: [Character] = []
let keys = dictAccordance.keys // all keys (opening characters)
let values = dictAccordance.values // all values (closing characters)
for char in str.characters {
switch char {
// met char from keys. (Met opening character)
case (let key) where keys.contains(char):
balArr.append(key)
// met char from values. (Met closing character)
case (let value) where values.contains(char):
let lastOpenedCharKey = balArr.removeLast() // key of char
// check last matching
if dictAccordance[lastOpenedCharKey] != value {
return false
}
default:
break
}
}
return balArr.isEmpty
}
override func viewDidLoad() {
super.viewDidLoad()
let dictAccordance: [Character : Character] = [
"(" : ")",
"[" : "]",
"{" : "}",
"<" : ">" // put dict whatever you want
]
let test1 = isBalanced(str: "sdvs", dictAccordance: dictAccordance)
let test2 = isBalanced(str: "()", dictAccordance: dictAccordance)
let test3 = isBalanced(str: "[]<<>>", dictAccordance: dictAccordance)
let test4 = isBalanced(str: "kn(jdnsv;)ds[svds]dvs", dictAccordance: dictAccordance)
let test5 = isBalanced(str: "(dacadc[])", dictAccordance: dictAccordance)
let test6 = isBalanced(str: "([) ewf]", dictAccordance: dictAccordance)
let test7 = isBalanced(str: "[ (()]", dictAccordance: dictAccordance)
let arrTest = [test1, test2, test3, test4, test5, test6, test7]
print(arrTest)
}