go语言中的container有heap、list、ring,没有stack。

其中heap是优先级队列,虽然有Push()/Pop()接口,但是使用heap要实现heap.Interface接口,不够简洁。

所以这里用list封装了一个简单的stack,留作他用。

 package stack

 import "container/list"

 type Stack struct {
list *list.List
} func NewStack() *Stack {
list := list.New()
return &Stack{list}
} func (stack *Stack) Push(value interface{}) {
stack.list.PushBack(value)
} func (stack *Stack) Pop() interface{} {
e := stack.list.Back()
if e != nil {
stack.list.Remove(e)
return e.Value
}
return nil
} func (stack *Stack) Peak() interface{} {
e := stack.list.Back()
if e != nil {
return e.Value
} return nil
} func (stack *Stack) Len() int {
return stack.list.Len()
} func (stack *Stack) Empty() bool {
return stack.list.Len() ==
}

测试代码:

 package stack

 import "testing"

 func TestStack(t *testing.T) {
stack := NewStack()
stack.Push()
stack.Push()
stack.Push()
stack.Push() len := stack.Len()
if len != {
t.Errorf("stack.Len() failed. Got %d, expected 4.", len)
} value := stack.Peak().(int)
if value != {
t.Errorf("stack.Peak() failed. Got %d, expected 4.", value)
} value = stack.Pop().(int)
if value != {
t.Errorf("stack.Pop() failed. Got %d, expected 4.", value)
} len = stack.Len()
if len != {
t.Errorf("stack.Len() failed. Got %d, expected 3.", len)
} value = stack.Peak().(int)
if value != {
t.Errorf("stack.Peak() failed. Got %d, expected 3.", value)
} value = stack.Pop().(int)
if value != {
t.Errorf("stack.Pop() failed. Got %d, expected 3.", value)
} value = stack.Pop().(int)
if value != {
t.Errorf("stack.Pop() failed. Got %d, expected 2.", value)
} empty := stack.Empty()
if empty {
t.Errorf("stack.Empty() failed. Got %d, expected false.", empty)
} value = stack.Pop().(int)
if value != {
t.Errorf("stack.Pop() failed. Got %d, expected 1.", value)
} empty = stack.Empty()
if !empty {
t.Errorf("stack.Empty() failed. Got %d, expected true.", empty)
} nilValue := stack.Peak()
if nilValue != nil {
t.Errorf("stack.Peak() failed. Got %d, expected nil.", nilValue)
} nilValue = stack.Pop()
if nilValue != nil {
t.Errorf("stack.Pop() failed. Got %d, expected nil.", nilValue)
} len = stack.Len()
if len != {
t.Errorf("stack.Len() failed. Got %d, expected 0.", len)
}
}

下载stack.zip

【golang】用container/list实现栈(Stack)的更多相关文章

  1. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  2. BSS段 data段 text段 堆heap 和 栈stack

    BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.   数 ...

  3. [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...

  4. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  5. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  6. STL(标准模板库) 中栈(stack)的使用方法

    STL 中栈的使用方法(stack) 基本操作: stack.push(x)  将x加入栈stack中,即入栈操作 stack.pop()  出栈操作(删除栈顶),只是出栈,没有返回值 stack.t ...

  7. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  8. 栈stack(2):栈的链表实现

    定义 从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表.同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定 ...

  9. 栈stack(1):栈的数组实现

    定义 栈(stack),是一个只允许在表尾端进行删除插入操作的线性表,是一种后进先出(LIFO,last in first out)的数据结构. 因此,对于栈来说,我们规定进行删除插入操作的表尾端称为 ...

  10. Java中堆(heap)和栈(stack)的区别

    简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...

随机推荐

  1. 13.首次安装CY7C68013A驱动失败记(结果竟然是这样)

    原文地址:首次安装CY7C68013A驱动失败记(结果竟然是这样)作者:孙茂多 今天把68013A-56焊接在CCD2的CPLD PCB上,配套的EEPROM存储器还没有焊接上,所以想用它试验一下Cy ...

  2. QT 字符串相等间距字符间增加字符

    /*************************************************Function: formatString()Description: 将十六进制字串每字节中间加 ...

  3. 硬件相关-EMI & EMS & EMC

    EMI——Electro Magnetic Interference 电磁干扰 定义:是指电磁波与电子元件作用后而产生的干扰现象. 分类:有传导干扰和辐射干扰两种. 传导干扰: 是指通过导电介质把一个 ...

  4. InputStream和OutputStream与String之间的转换

    //1.字符串转inputstream String str="aaaaa"; InputStream in = new ByteArrayInputStream(str.getB ...

  5. STL容器的适用情况

     转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...

  6. 最全的CMD命令

    CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) . appwiz.cpl:程序和功能 . calc:启动计算器 . certmgr.ms ...

  7. window.showModalDialog的传值和返回值

    window.showModalDialog(URL,dialogArgments,features) 打开一个新窗口 URL为要将打开的网页地址. dialogArgments为设定好传递给新视窗网 ...

  8. 强力重置ASP.NET membership加密后的密码![转]

    公司网站的用户管理采用的是ASP.NET内置的membership管理,在web.config文件中的密码格式配置是加密了的,passwordFormat="Hashed",这样在 ...

  9. [翻译]The Neophyte's Guide to Scala Part 12: Type Classes

    The Neophyte's Guide to Scala Part 12: Type Classes 过去的两周我们讨论了一些使我们保持DRY和灵活性的函数式编程技术,特别是函数组合,partial ...

  10. c#比较器 排序

    原地址:http://blog.csdn.net/xutao_ustc/article/details/6314057 class Program { static void Main(string[ ...