栈(stack),是具有一定操作约束的线性表。其只能在一端(栈顶,Top)做插入、删除操作。
- 插入数据:入栈(Push)
- 删除数据:出栈(Pop)
- 先入后出:Last In First Out(LIFO)
栈的抽象数据类型描述
数据对象集:一个有0或多个元素的线性表。
操作集:
生成空栈,其最大长度为MaxSize
判断栈是否已满
判断栈是否为空
将元素压入栈
将栈顶元素返回并删除
1.栈的顺序存储实现
栈的顺序存储结构体,通常由一个数组和一个记录栈顶元素位置的变量组成。
1.1结构体定义
type Stack struct {
MaxSize int
Top int
arr [10]int
}
1.2 初始化栈
func initStack() (stack *Stack) {
stack = &Stack{
MaxSize: 10,
Top: -1,
arr: [10]int{},
}
return stack
}
1.3入栈
func (s *Stack) push(v int) error {
//判断栈是否满
if s.MaxSize-1 == s.Top {
return errors.New("栈已满,无法插入数据")
}
s.Top++ //栈顶+1
s.arr[s.Top] = v //入栈
return nil
}
1.4出栈
func (s *Stack) pop() (int, error) {
//判断栈是否为空
if s.Top == -1 {
return 0, errors.New("error: 栈为空")
}
v := s.arr[s.Top] //出栈
s.Top-- //栈顶-1
return v, nil
}
1.5完整代码
package main
import (
"errors"
"fmt"
)
type Stack struct {
MaxSize int
Top int
arr [10]int
}
func main() {
//初始化一个栈
stack1 := initStack()
//验证空栈pop报错
fmt.Println("---空栈pop报错---")
_, err := stack1.pop()
if err != nil {
fmt.Println(err)
}
//入栈
fmt.Println("---栈满push报错---")
for i := 1; 1 <= 20; i++ {
err := stack1.push(i)
if err != nil {
fmt.Println(err)
break
}
}
//出栈
v, _ := stack1.pop()
fmt.Println("---pop出栈---:", v)
}
func initStack() (stack *Stack) {
stack = &Stack{
MaxSize: 10,
Top: -1,
arr: [10]int{},
}
return stack
}
func (s *Stack) push(v int) error {
//判断栈是否满
if s.MaxSize-1 == s.Top {
return errors.New("栈已满,无法插入数据")
}
s.Top++ //栈顶+1
s.arr[s.Top] = v //入栈
return nil
}
func (s *Stack) pop() (int, error) {
//判断栈是否为空
if s.Top == -1 {
return 0, errors.New("error: 栈为空")
}
v := s.arr[s.Top] //出栈
s.Top-- //栈顶-1
return v, nil
}