栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。
栈有时又叫lifo(先进后出)表。 (推荐学习:go)
对栈的操作有push(进栈)和pop(出栈),前者相当于插入,后者相当于删除最后插入的元素。
以下用双向链表和切片实现分别实现栈操作
//stack//用双向链表实现stacktype element interface {}var header *entry //链表表头var size int //栈的长度type entry struct { previous *entry next *entry element element}func newentry(prev,next *entry,e element) *entry { return &entry{prev,next,e}}//初始化header 表头func newstack() *entry { header = newentry(nil,nil,nil) header.previous =header header.next = header return header}type stack interface { push(e element) //向栈顶添加元素 pop() element //移除栈顶元素 top() element //获取栈顶元素(不删除) clear() bool //清空栈 size() int //获取栈的元素个数 isempty() bool //判断栈是否是空栈}//向栈顶添加元素func (e *entry) push(element element) { addbefore(header,element)}//移除栈顶元素func (e *entry) pop() element { if e.isempty() { fmt.println("stack is empty!") return nil } preventry := header.previous preventry.previous.next = header header.previous = preventry.previous size-- return preventry.element}//获取栈顶元素(不删除)func (e *entry) top() element { if e.isempty() { fmt.println("stack is empty!") return nil } return header.previous.element}//清空栈func (e *entry) clear() bool { if e.isempty() { fmt.println("stack is empty!") return false } entry := header.next for entry != header { nextentry := entry.next entry.next = nil entry.previous = nil entry.element = nil entry = nextentry } header.next = header header.previous = header size =0 return true}func (e *entry) size() int { return size}func (e *entry) isempty() bool { if size == 0 { return true } return false}//在entry节点之前添加func addbefore(e *entry,element element) element{ newentry := newentry(e.previous,e,element) newentry.previous.next = newentry newentry.next.previous = newentry size++ return newentry}//****************************************//****************************************//用切片实现stacktype sliceentry struct{ element []element}func newsliceentry() *sliceentry { return &sliceentry{}}func (entry *sliceentry)push(e element) { entry.element = append(entry.element,e)}func (entry *sliceentry)pop() element { size := entry.size() if size == 0 { fmt.println("stack is empty!") return nil } lastelement := entry.element[size-1] entry.element[size-1] = nil entry.element = entry.element[:size-1] return lastelement}func (entry *sliceentry)top() element { size := entry.size() if size == 0 { fmt.println("stack is empty!") return nil } return entry.element[size-1]}func (entry *sliceentry)clear() bool { if entry.isempty() { fmt.println("stack is empty!") return false } for i :=0;i<entry.size();i++ { entry.element[i] = nil } entry.element = make([]element,0) return true}func (entry *sliceentry)size() int { return len(entry.element)}func (entry *sliceentry)isempty() bool { if len(entry.element) == 0 { return true } return false}func main() { test1()}//测试双向链表实现的stackfunc test1() { stack := newstack() for i := 0;i<50;i++ { stack.push(i) } fmt.println(stack.top()) fmt.println(stack.size()) fmt.println(stack.pop()) fmt.println(stack.top()) fmt.println(stack.clear()) fmt.println(stack.isempty()) for i := 0;i<50;i++ { stack.push(i) } fmt.println(stack.top())}//测试切片实现的stackfunc test2() { entry := newsliceentry() for i:= 0;i<50;i++ { entry.push(i) } fmt.println(entry.size()) fmt.println(entry.top()) fmt.println(entry.pop()) fmt.println(entry.top(),entry.size()) fmt.println(entry.clear()) for i:= 0;i<50;i++ { entry.push(i) } fmt.println(entry.size())}//两种方法性能比较func test3() { t := time.now() slicestack := newsliceentry() for i:= 0;i<500000;i++ { slicestack.push(i) } fmt.println(time.since(t)) t = time.now() stack := newstack() for i:=0;i<500000;i++ { stack.push(i) } fmt.println(time.since(t))}
以上就是golang 怎么设计一个栈的详细内容。