golang实现简单的栈
栈的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实现简单的栈的更多相关文章
- C语言 简单的栈
//简单的栈 #include<stdio.h> #include<stdlib.h> //栈的介绍:栈先进后出,一般用于将数据逆序输出 //栈一般只有四种方法--进栈,出栈, ...
- C++编程练习(4)----“实现简单的栈的链式存储结构“
如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...
- C++编程练习(3)----“实现简单的栈的顺序存储结构“
栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom). 栈又称为后进先出(Last In First Out)的线性表,简 ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- hdu-1237简单计算器(栈的运用)
http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...
- hiho #1332 : 简单计算器 栈+递归
#1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...
- 代码片段 - Golang 实现简单的 Web 服务器
------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1. ...
- Asp.net core与golang web简单对比测试
最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7 ...
- golang从简单的即时聊天来看架构演变
前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的. 我将从一个最简单的聊天室的 ...
随机推荐
- 你写的什么垃圾代码让Vsync命令不能及时处理呢?(1)
想想自己写的什么垃圾代码导致Vsync不能及时处理#(不高兴) 想不开? 实际开发中性能问题不好复现?这你就可能需要一些工具来帮你检测这种情况. 首先是Android系统自带的工具(4.1之后的版本) ...
- 游戏攻略 Re:LieF ~親愛なるあなたへ~ (relief给挚爱的你)
箒木 日向子 反対(賛成) ◆セーブ01 図書館へ向かう ◆セーブ02 日向子 食べてあげない もちろん.おいしかったよ コミュニケーション (汉化版显示为:交流) 日向子END ※回想2個目に追加 ...
- 回归JavaScript基础(四)
主题:JavaScript变量.作用域和内存问题 JavaScript的变量和别的语言比起来是与众不同的.说道变量,不得不谈他的作用域.同很多语言一样,JavaScript开发者也不用担心开发中内存的 ...
- zabbix使用问题
1中文乱码 https://www.linuxidc.com/Linux/2017-08/146162.htm 软件 说明 备注 zabbix 3.4.7 操作系统 Centos7 问题描述:图表内容 ...
- java语言导学(5版)--第12章并发之二
1不可变对象 概念:(immutable)对象创建后,状态不可更改.不可变对象在并发程序中尤其有用,因状态不可变,不会被线程干扰,也不会出现不一致状态. 书中通过实例是可变的类,并从此类衍生出一个不可 ...
- 梯度下降法实现最简单线性回归问题python实现
梯度下降法是非常常见的优化方法,在神经网络的深度学习中更是必会方法,但是直接从深度学习去实现,会比较复杂.本文试图使用梯度下降来优化最简单的LSR线性回归问题,作为进一步学习的基础. import n ...
- “拒绝了对对象数据库的 EXECUTE 权限”之解决
“拒绝了对对象'aspnet_CheckSchemaVersion'的 EXECUTE 权限”之解决 [错误状态] “/XXX”应用程序中的服务器错误. ----------------------- ...
- Linux 系统调整内核参数
调整系统内核参数 内核优化:Linux系统(内核 + shell + 应用程序) 针对业务服务应用而进行的系统内核参数调整(主要是/etc/sysctl.conf文件) 1. vim /e ...
- symfony学习笔记1—简介
1.symfony快速入门还是先看代码结构把,这个是拿到代码的第一印象,app/:整个应用的配置,模版,translations,这个可能是多语言文件什么,src/:项目php文件,vendor/:第 ...
- Spring Boot REST
资源(Resources) 所谓资源,就是网络上一个实体,或者是网络上一个具体信息.他可以是一段文本,一张图片,一种服务,总之是一个具体的实体.可以用一个URI(统一资源定位符)指向它,每种资源对应一 ...