如何用go语言设计一个栈?-创新互联
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。

栈有时又叫LIFO(先进后出)表。
对栈的操作有Push(进栈)和Pop(出栈),前者相当于插入,后者相当于删除最后插入的元素。
以下用双向链表和切片实现分别实现栈操作
//stack
//用双向链表实现stack
type 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
}
//****************************************
//****************************************
//用切片实现Stack
type 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以上就是golang 怎么设计一个栈的详细内容,更多请关注创新互联成都网站设计公司其它相关文章!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享标题:如何用go语言设计一个栈?-创新互联
分享网址:http://www.jxjierui.cn/article/dicdpi.html


咨询
建站咨询
