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. iTween

    http://u3d.as/content/pixelplacement/i-tween/1s9 download http://itween.pixelplacement.com/documenta ...

  2. PostgreSQL中的引号和null

    今天工作时写了一个sql,但是PostgreSQL总是提示有语法错误,简单的做个记录:  问题1.'' 和“”单引号和双引号         举个例子: #.select id, delivery_d ...

  3. TF-IDF与余弦相似性的应用(二):找出相似文章

    上一次,我用TF-IDF算法自动提取关键词. 今天,我们再来研究另一个相关的问题.有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章.比如,"Google新闻"在主新闻 ...

  4. Why Every Professional Should Consider Blogging

    转自http://www.pixelstech.net/article/1327829407-Why-Every-Professional-Should-Consider-Blogging ften ...

  5. Careercup - Google面试题 - 6332750214725632

    2014-05-06 10:18 题目链接 原题: Given a ,) (,) (,), (,) should be returned. Some suggest to use Interval T ...

  6. sudo su 提示没有配置JDK environment

    sudo su 提示没有配置JDK environment 最近工作遇到一问题,我通过SecureCRT远程登录服务器,部署web应用.将变更文件替换后,我需要切换到root用户,重启Tomcat.所 ...

  7. java 验证电话号码(手机和固话)

  8. 对话机器学习大神Yoshua Bengio(上)

    Yoshua Bengio教授(个人主页)是机器学习大神之一,尤其是在深度学习这个领域.他连同Geoff Hinton老先生以及 Yann LeCun(燕乐存)教授,缔造了2006年开始的深度学习复兴 ...

  9. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  10. Uart串口与RS232串口的区别

    Uart指的是TTL电平的串口:RS232指的是RS232电平的串口. TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平. Uart串口的RXD ...