[数据结构]之栈 ##1 描述 栈:后进先出的数据结构。栈是封底的,只能从一个方向写入读出。栈的实现有两种,基于顺序表方式和基于链表方式。栈的场景:比如浏览器的返回场景。顺序表实现:1)在顺序表的基础上创建栈。2)使用arr[0]作为栈底,arr[MAXSIZE]为栈顶。Top当栈顶元素位置标志,从0-MAXSIZE之间。3)局限:分配的空间固定。链表实现:1)链表的基础上创建栈。2)使用末尾节点作为栈底,头节点为栈顶。Top为栈顶元素位置标志。##2 数据结构 * 顺序表实现:1)属性元素数组 elemets 栈顶元素位置 top元素个数 length(值为top+1)2)操作 NewStack 初始化,建立空栈Push 压栈Pop 出栈* 链表实现 1 属性栈顶节点 top元素个数 length2 操作 NewStack 初始化,建立空栈Push 压栈Pop 出栈##3 go语言实现1 顺序表实现:package mainimport ("fmt")const CAP = 20type Stack struct {elements [CAP]stringtop int `栈顶位置`length int `元素个数`}func NewStack() *Stack {return &Stack{top: -1, length: 0}}/** 压栈*/func (list *Stack) Push(elem string) error {if list.top == CAP-1 {return fmt.Errorf("the list is full")}//插入到栈顶元素上list.top++list.length++list.elements[list.top] = elemreturn nil}/** 出栈*/func (list *Stack) Pop() (string, error) {if list.top == -1 {return "", fmt.Errorf("the list is empty")}//获取需要出栈的元素elem := list.elements[list.top]list.top--list.length--return elem, nil}func main() {list := NewStack()list.Push("AAAAA")list.Push("BBBBB")list.Push("CCCCC")list.Push("DDDDD")for list.length > 0 {elem, _ := list.Pop()fmt.Println("elem:", elem)}}2 链表实现package mainimport ("fmt")/** 定义节点*/type Node struct {Data stringNext *Node}/** 定义栈*/type Stack struct {Top *NodeLength int}func NewStack() *Stack {return &Stack{Top: nil, Length: 0}}/** 压栈*/func (list *Stack) Push(data string) error {node := &Node{Data: data, Next: list.Top}list.Top = nodelist.Length++return nil}/** 出栈*/func (list *Stack) Pop() (string, error) {if list.Length == 0 {return "", fmt.Errorf("the list is empty")}node := list.Toplist.Top = node.Nextlist.Length--return node.Data, nil}func main() {list := NewStack()list.Push("AAAAA")list.Push("BBBBB")list.Push("CCCCC")list.Push("DDDDD")list.Push("EEEEE")for list.Length > 0 {elem, _ := list.Pop()fmt.Println("elem:", elem)}}
转载于:https://www.cnblogs.com/sxt102400/archive/2013/04/17/3026678.html