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. UIView 添加子视图的常用方法

    1.  - (void)addSubview:(UIView *)view 这是最常用的方法有两个注意点 参数view可以是nil,运行不会报错,当然,父视图的subViews也不会增加. 此方法增加 ...

  2. c++函数内部声明函数,在函数外面实现函数是可以的

    这个具体有什么用我也不大清楚,只知道可以这样 #include <iostream> //#include "header1.h" using namespace st ...

  3. Daily Scrum3

    今天我们小组开会内容分为以下部分: part 1: 汇报之前分配的任务进度: part 2:分配明天的任务. ◆Part 1 组员进度报告 彭佟小组完成的优化目标:     关于软件防滥用及垃圾信息拦 ...

  4. j2SE基回顾(一)

    1. 九种基本数据类型的大小,以及他们的封装类. 2. Switch能否用string做参数? 3. equals与==的区别. 4. Object有哪些公用方法? Object是所有类的父类,任何类 ...

  5. android listview和button,ImageButton等有事件的控件的总结

    public ImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defSty ...

  6. 转载------------------关于android的一些技巧

    Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击 ...

  7. java list中的对象,按对象某属性排序

    1:对象类 需要 实现: public class TreeNode extends BaseBean implements Comparable <TreeNode> { private ...

  8. Ubuntu 下编译安装linux

    1. 准备工作切换为管理员权限,sudo –i 输入用户密码 进入root 权限apt-get install build-essential kernel-package libncurses5-d ...

  9. hdu 3926 Hand in Hand 同构图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 In order to get rid of Conan, Kaitou KID disguis ...

  10. 序列化Color对象

    如下: public class Class2 { [XmlIgnore] public Color Color1 { get { return color1; } set { color1 = va ...