# go 实现栈
数据结构栈,主要就是 pop&push, 其他的属性和功能都是服务于pop&push的
## code
以一个存储字符byte的栈为例
```go
type Stack struct {
data []byte
top int
size int
}
func NewStack() *Stack {
return &Stack{
data: make([]byte, 0),
top: 0,
}
}
// 如果有必要可以再维护一个size来限制栈的最大长度
func (s *Stack) IsFull() bool {
if s.top == s.size {
return true
}
return false
}
func (s *Stack) IsEmpty() bool {
if s.top == 0 {
return true
}
return false
}
func (s *Stack) Push(e byte) bool {
s.data = append(s.data, e)
s.top++
return true
}
func (s *Stack) Pop() (flag bool, ret byte) {
if s.IsEmpty() {
return false, ret
}
ret = s.data[s.top-1]
s.data = s.data[:s.top-1]
s.top--
return true, ret
}
```
## leetCode20
接下来使用上面实现的栈来解一道简单的题目
```go
type Stack struct {
data []byte
top int
size int
}
func NewStack() *Stack {
return &Stack{
data: make([]byte, 0),
top: 0,
}
}
func (s *Stack) IsFull() bool {
if s.top == s.size {
return true
}
return false
}
func (s *Stack) IsEmpty() bool {
if s.top == 0 {
return true
}
return false
}
func (s *Stack) Push(e byte) bool {
s.data = append(s.data, e)
s.top++
return true
}
func (s *Stack) Pop() (flag bool, ret byte) {
if s.IsEmpty() {
return false, ret
}
ret = s.data[s.top-1]
s.data = s.data[:s.top-1]
s.top--
return true, ret
}
func isValid(s string) bool {
stack := NewStack()
for i := 0; i < len(s); i++ {
if s[i] == '(' {
stack.Push(s[i])
}
if s[i] == ')' {
if flag, top := stack.Pop(); flag == true && top == '(' {
continue
} else {
return false
}
}
if s[i] == '{' {
stack.Push(s[i])
}
if s[i] == '}' {
if flag, top := stack.Pop(); flag == true && top == '{' {
continue
} else {
return false
}
}
if s[i] == '[' {
stack.Push(s[i])
}
if s[i] == ']' {
if flag, top := stack.Pop(); flag == true && top == '[' {
continue
} else {
return false
}
}
}
if stack.IsEmpty() {
return true
}
return false
}
```
有疑问加站长微信联系(非本文作者))