Golang实现数据结构-(括号匹配)
Golang 栈应用实现括号匹配
1 算法思想
匹配成功条件: 每一个 "(" 都拥有一个与之匹配的")", 且次序相反.即 第 1 个左括号对应的是倒数第 1 个 右括号. 非常契合栈次序反转的特性.2 代码实现
package main
import "fmt"
//逻辑结构: 只允许在栈顶进行插入和删除的线性表
type Stack struct {
top int //栈顶指针
data []interface{} //数据元素
}
//初始化
func (s *Stack) InitList(maxSize int) {
s.data = make([]interface{}, maxSize)
s.top = -1
}
// 判空
func (s Stack) isNull() bool {
if s.top != -1 {
return false
}
return true
}
// 判满
func (s Stack) isFull() bool {
if s.top < cap(s.data)-1 {
return false
}
return true
}
// 压入
func (s *Stack) Push(Element interface{}) bool {
if s.isFull() {
return false
}
s.top++
s.data[s.top] = Element
return true
}
// 压出
func (s *Stack) Pop() (interface{}, bool) {
if s.isNull() {
return nil, false
}
e := s.data[s.top]
s.top--
return e, true
}
// 括号匹配
func BracketMatch(SrcString string) bool {
s := Stack{}
s.InitList(20)
for i := 0; i < len(SrcString); i++ {
if SrcString[i] == '(' && !s.isFull(){
s.Push(SrcString[i]) //左括号, 入栈
}
if SrcString[i] == ')'{
if s.isNull(){ //如果是右括号, 判断是否栈空, 栈空匹配失败, 否则出栈左括号
return false
}
s.Pop()
}
}
if s.top != -1 {
return false
}
return true
}
func main() {
fmt.Println(BracketMatch("(")) //false
fmt.Println(BracketMatch("(()")) //false
fmt.Println(BracketMatch("(())")) //true
}