栈的ADT


数据

栈的数据对象集合为{a1,a2,a3...an},具有相同数据类型,有唯一前驱后续


操作

  • InitStack() *Stack //初始化操作,创建一个空栈
  • Clear() //清空栈
  • IsEmpty() bool //栈是否为空,若栈为空,返回 true,否则 返回 false。
  • Peek() interface{} //若栈存在且非空,返回栈顶元素。
  • Push(data interface{}) //将数据data压入栈
  • Pop() //若栈不为空,出栈
  • Length() int //返回栈中元素个数

代码实现

stack.go

package stack

import (
"sync"
) type Stack struct {
data []interface{}
length int
capacity int
sync.Mutex
} // 构建一个空栈
func InitStack() *Stack {
return &Stack{data: make([]interface{}, 8), length: 0, capacity: 8}
} // 压栈操作
func (s *Stack) Push(data interface{}) {
s.Lock()
defer s.Unlock() if s.length+1 >= s.capacity {
s.capacity <<= 1
t := s.data
s.data = make([]interface{}, s.capacity)
copy(s.data, t)
} s.data[s.length] = data
s.length++
} // 出栈操作
func (s *Stack) Pop() interface{} {
s.Lock()
defer s.Unlock() if s.length <= 0 {
panic("int stack pop: index out of range")
} t := s.data[s.length-1]
s.data = s.data[:s.length-1]
s.length-- return t
} // 返回栈顶元素
func (s *Stack) Peek() interface{} {
s.Lock()
defer s.Unlock() if s.length <= 0 {
panic("empty stack")
} return s.data[s.length-1]
} // 返回当前栈元素个数
func (s *Stack) Count() int {
s.Lock()
defer s.Unlock() t := s.length return t
} // 清空栈
func (s *Stack) Clear() {
s.Lock()
defer s.Unlock() s.data = make([]interface{}, 8)
s.length = 0
s.capacity = 8
} // 栈是否为空
func (s *Stack) IsEmpty() bool {
s.Lock()
defer s.Unlock()
b := s.length == 0
return b
}

stack_test.go

package stack

import (
"testing" gcv "github.com/smartystreets/goconvey/convey"
) func TestInitStack(t *testing.T) {
s := InitStack()
gcv.Convey("栈不应该为空", t, func() {
gcv.So(s, gcv.ShouldNotBeNil)
})
} func TestPush(t *testing.T) {
s := InitStack()
for i := 0; i < 100; i++ {
s.Push(i)
}
gcv.Convey("入栈测试", t, func() {
gcv.Convey("栈大小应该为100", func() {
gcv.So(s.length, gcv.ShouldEqual, 100)
})
gcv.Convey("栈中元素应该为0-99", func() {
gcv.So(func() bool {
for i := 0; i < 100; i++ {
if s.data[i] != i {
return false
}
}
return true
}(), gcv.ShouldEqual, true)
})
})
} func TestPop(t *testing.T) {
gcv.Convey("出栈测试", t, func() {
gcv.Convey("栈中元素应该为99-0", func() {
gcv.So(func() bool {
s := InitStack()
for i := 0; i < 100; i++ {
s.Push(i)
}
for i := 99; i > -1; i-- {
t := s.Pop().(int)
if t != i {
return false
}
}
return true
}(), gcv.ShouldEqual, true)
})
})
} func TestPeek(t *testing.T) {
gcv.Convey("栈顶操作", t, func() {
s := InitStack()
s.Push(1)
s.Push(2)
tmp := s.Peek().(int)
gcv.So(tmp, gcv.ShouldEqual, 2)
})
}

golang实现简单的栈的更多相关文章

  1. C语言 简单的栈

    //简单的栈 #include<stdio.h> #include<stdlib.h> //栈的介绍:栈先进后出,一般用于将数据逆序输出 //栈一般只有四种方法--进栈,出栈, ...

  2. C++编程练习(4)----“实现简单的栈的链式存储结构“

    如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...

  3. C++编程练习(3)----“实现简单的栈的顺序存储结构“

    栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom). 栈又称为后进先出(Last In First Out)的线性表,简 ...

  4. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  5. hdu-1237简单计算器(栈的运用)

    http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...

  6. hiho #1332 : 简单计算器 栈+递归

    #1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...

  7. 代码片段 - Golang 实现简单的 Web 服务器

    ------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1. ...

  8. Asp.net core与golang web简单对比测试

    最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7 ...

  9. golang从简单的即时聊天来看架构演变

    前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的. 我将从一个最简单的聊天室的 ...

随机推荐

  1. mysql 字符串函数、分组函数

    字符串函数 1.concat 函数 drop table test;create table test(id int(4), name varchar(10), sex char(2));insert ...

  2. .NET基础一

    .NET FrameWork是用于Windows的新托管代码编程模型,它包含CLR(Common Language Runtime)以及BCL(Base CLass Library)构成. 一.CLR ...

  3. 全局唯一ID生成器

    分布式环境中,如何保证生成的id是唯一不重复的? twitter,开源出了一个snowflake算法,现在很多企业都按照该算法作为参照,实现了自己的一套id生成器. 该算法的主要思路为: 刚好64位的 ...

  4. 转:oracle:win7手工卸载oracle数据库11g

    环境:oracle 11g,win7,64bit 问题:oracle不正常安装.重新安装等情况需要卸载软件,然而oracle11g取消了界面卸载,改为deinstall.bat文件执行卸载.具体关于d ...

  5. NSOperation的使用细节 [3]

    NSOperation的使用细节 [3] 这一节我们来写自定义concurrent的operation,自定义concurrent的operation稍微有点复杂,需要按照某些既定的步骤编写才可以完成 ...

  6. 限定pan手势只能在圆内移动view

    限定pan手势只能在圆内移动view 效果: 虽然看起来很简单,但实现原理还是稍微有点复杂-_-!! 核心的地方,就是需要计算pan手势的点与指定点的距离,不能超过这个距离,超过了就让动画还原,很容易 ...

  7. linux中ftp提示--553 Could not create file

    今天在阿里云的linux上搭建ftp服务的时候,搭建成功之后,上传文件时总提示553 Could not create file,找了半天原因,终于解决了 ftp主目录为/home/myftp /ho ...

  8. IP地址分类和网段区分的知识

    IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段 简单来说在公司或企业内部看到的就基本都是内网IP,ABC三类IP地址里的常见IP段. 每个IP地址都包含两部分,即网络号 ...

  9. October 07th 2017 Week 40th Saturday

    Knowledge is a treasure but practice is the key to it. 知识是宝藏,但实践才是打开它的钥匙. Experience often comes fro ...

  10. Spring Boot 以 war 方式部署

    Spring Boot 默认自带了一个嵌入式的 Tomcat 服务器,可以以jar方式运行,更为常见的情况是需要将 Spring Boot 应用打包成一个 war 包,部署到 Tomcat.Jerry ...