经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
golang实现简单的栈
来源:cnblogs  作者:麻辣条  时间:2019/1/7 9:46:54  对本文有异议

栈的ADT


数据

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


操作

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

代码实现

stack.go

  1. package stack
  2. import (
  3. "sync"
  4. )
  5. type Stack struct {
  6. data []interface{}
  7. length int
  8. capacity int
  9. sync.Mutex
  10. }
  11. // 构建一个空栈
  12. func InitStack() *Stack {
  13. return &Stack{data: make([]interface{}, 8), length: 0, capacity: 8}
  14. }
  15. // 压栈操作
  16. func (s *Stack) Push(data interface{}) {
  17. s.Lock()
  18. defer s.Unlock()
  19. if s.length+1 >= s.capacity {
  20. s.capacity <<= 1
  21. t := s.data
  22. s.data = make([]interface{}, s.capacity)
  23. copy(s.data, t)
  24. }
  25. s.data[s.length] = data
  26. s.length++
  27. }
  28. // 出栈操作
  29. func (s *Stack) Pop() interface{} {
  30. s.Lock()
  31. defer s.Unlock()
  32. if s.length <= 0 {
  33. panic("int stack pop: index out of range")
  34. }
  35. t := s.data[s.length-1]
  36. s.data = s.data[:s.length-1]
  37. s.length--
  38. return t
  39. }
  40. // 返回栈顶元素
  41. func (s *Stack) Peek() interface{} {
  42. s.Lock()
  43. defer s.Unlock()
  44. if s.length <= 0 {
  45. panic("empty stack")
  46. }
  47. return s.data[s.length-1]
  48. }
  49. // 返回当前栈元素个数
  50. func (s *Stack) Count() int {
  51. s.Lock()
  52. defer s.Unlock()
  53. t := s.length
  54. return t
  55. }
  56. // 清空栈
  57. func (s *Stack) Clear() {
  58. s.Lock()
  59. defer s.Unlock()
  60. s.data = make([]interface{}, 8)
  61. s.length = 0
  62. s.capacity = 8
  63. }
  64. // 栈是否为空
  65. func (s *Stack) IsEmpty() bool {
  66. s.Lock()
  67. defer s.Unlock()
  68. b := s.length == 0
  69. return b
  70. }

stack_test.go

  1. package stack
  2. import (
  3. "testing"
  4. gcv "github.com/smartystreets/goconvey/convey"
  5. )
  6. func TestInitStack(t *testing.T) {
  7. s := InitStack()
  8. gcv.Convey("栈不应该为空", t, func() {
  9. gcv.So(s, gcv.ShouldNotBeNil)
  10. })
  11. }
  12. func TestPush(t *testing.T) {
  13. s := InitStack()
  14. for i := 0; i < 100; i++ {
  15. s.Push(i)
  16. }
  17. gcv.Convey("入栈测试", t, func() {
  18. gcv.Convey("栈大小应该为100", func() {
  19. gcv.So(s.length, gcv.ShouldEqual, 100)
  20. })
  21. gcv.Convey("栈中元素应该为0-99", func() {
  22. gcv.So(func() bool {
  23. for i := 0; i < 100; i++ {
  24. if s.data[i] != i {
  25. return false
  26. }
  27. }
  28. return true
  29. }(), gcv.ShouldEqual, true)
  30. })
  31. })
  32. }
  33. func TestPop(t *testing.T) {
  34. gcv.Convey("出栈测试", t, func() {
  35. gcv.Convey("栈中元素应该为99-0", func() {
  36. gcv.So(func() bool {
  37. s := InitStack()
  38. for i := 0; i < 100; i++ {
  39. s.Push(i)
  40. }
  41. for i := 99; i > -1; i-- {
  42. t := s.Pop().(int)
  43. if t != i {
  44. return false
  45. }
  46. }
  47. return true
  48. }(), gcv.ShouldEqual, true)
  49. })
  50. })
  51. }
  52. func TestPeek(t *testing.T) {
  53. gcv.Convey("栈顶操作", t, func() {
  54. s := InitStack()
  55. s.Push(1)
  56. s.Push(2)
  57. tmp := s.Peek().(int)
  58. gcv.So(tmp, gcv.ShouldEqual, 2)
  59. })
  60. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号