概述
有一个输入字符串,只包含以下字符
-
(
-
)
-
{
-
}
-
[
-
]
其目的是检查输入的字符串是否有有效的小括号。一个小括号是有效的,如果
- 打开的小括号应该以相同的顺序关闭。意味着下面的括号将是无效的,因为括号没有按照正确的顺序关闭
([)]
- 每个开放的括号都应该有相应的封闭括号
有效括号的例子
()
{}
[]
()[]
([{}])
()[{}]
无效小括号示例
([)]
(
{
[
(()
程序
我们的想法是使用一个堆栈
-
如果给定的小括号是左小括号,我们就把它推到堆栈里。
-
如果给定的括号是右括号,我们从堆栈中弹出,并检查弹出的左括号是否与当前的右括号对应。例如,如果我们在字符串中遇到**']',我们就弹出并检查弹出的值是否只是'['。如果它不是,我们就返回false。对于')'** 和 **'}'**也是如此。
-
在字符串的最后,堆栈应该是空的。
下面是相同的程序。
package main
import (
"container/list"
"fmt"
)
func main() {
valid := isValid("()")
fmt.Println(valid)
valid = isValid("[]")
fmt.Println(valid)
valid = isValid("{}")
fmt.Println(valid)
valid = isValid("()[]")
fmt.Println(valid)
valid = isValid("([{}])")
fmt.Println(valid)
valid = isValid("()[{}]")
fmt.Println(valid)
valid = isValid("([)]")
fmt.Println(valid)
valid = isValid("(")
fmt.Println(valid)
valid = isValid("(()")
fmt.Println(valid)
}
type customStack struct {
stack *list.List
}
func (c *customStack) Push(value string) {
c.stack.PushFront(value)
}
func (c *customStack) Pop() error {
if c.stack.Len() > 0 {
ele := c.stack.Front()
c.stack.Remove(ele)
}
return fmt.Errorf("Pop Error: Stack is empty")
}
func (c *customStack) Front() (string, error) {
if c.stack.Len() > 0 {
if val, ok := c.stack.Front().Value.(string); ok {
return val, nil
}
return "", fmt.Errorf("Peep Error: Stack Datatype is incorrect")
}
return "", fmt.Errorf("Peep Error: Stack is empty")
}
func (c *customStack) Size() int {
return c.stack.Len()
}
func (c *customStack) Empty() bool {
return c.stack.Len() == 0
}
func isValid(s string) bool {
customStack := &customStack{
stack: list.New(),
}
for _, val := range s {
if val == '(' || val == '[' || val == '{' {
customStack.Push(string(val))
} else if val == ')' {
poppedValue, _ := customStack.Front()
if poppedValue != "(" {
return false
}
customStack.Pop()
} else if val == ']' {
poppedValue, _ := customStack.Front()
if poppedValue != "[" {
return false
}
customStack.Pop()
} else if val == '}' {
poppedValue, _ := customStack.Front()
if poppedValue != "{" {
return false
}
customStack.Pop()
}
}
return customStack.Size() == 0
}
输出
true
true
true
true
true
true
false
false
false