首页 > 编程语言 >golang算法—— 使用两个栈实现一个队列

golang算法—— 使用两个栈实现一个队列

时间:2022-11-22 23:33:07浏览次数:62  
标签:queue 队列 Pop element golang int 算法 Push stack1


前言

阅读本文,假定已经了解了基本数据结构概念。

队列: 先入先出。
栈: 先进后出。

分析

使用两个栈串联,可以实现先进先出。但是,得注意以下两点:

  • 队列在入列时,stack2必须为空,stack1满员,保证顺序。
  • 队列在出列时,stack1必须为空,stack2满员

实现

type Stack struct {
element []int
}

func NewStack(col int) *Stack {
return &Stack{
element: make([]int, 0, col),
}
}

func (s Stack) Len() int{
return len(s.element)
}

func (s *Stack) Push(elem int) {
s.element = append(s.element, elem)
}

func (s *Stack) Pop() int {
if len(s.element) == 0 {
return 0
}
tmp := s.element[len(s.element)-1]
s.element = s.element[:len(s.element)-1]
return tmp
}

// 输出6 5
func TestStack(t *testing.T) {
stack := NewStack(10)

stack.Push(5)
stack.Push(6)

fmt.Println(stack.Pop())
fmt.Println(stack.Pop())
}

队列

// 用两个stack,作一个队列
type Queue struct {
stack1 *Stack
stack2 *Stack
}

func NewQueue(col int) *Queue {
return &Queue{
stack1: NewStack(col),
stack2: NewStack(col),
}
}
func (q Queue) Push(elem int) {
for q.stack2.Len() >0 {
q.stack1.Push(q.stack2.Pop())
}
q.stack1.Push(elem)
}

func (q Queue) Pop() int {
for q.stack1.Len() >0 {
q.stack2.Push(q.stack1.Pop())
}
rs:=q.stack2.Pop()
return rs
}

// 输出5 6 7 8
func TestQueue(t *testing.T) {
queue := NewQueue(10)

queue.Push(5)
queue.Push(6)
queue.Push(7)

fmt.Println(queue.Pop())
fmt.Println(queue.Pop())

queue.Push(8)

fmt.Println(queue.Pop())
fmt.Println(queue.Pop())
}

实现仓库

​https://github.com/fwhezfwhez/TestX/blob/0684f9df6f3a5c80f55c72f63d0843fbfd2aa432/test_practice/main_test.go#L73​


标签:queue,队列,Pop,element,golang,int,算法,Push,stack1
From: https://blog.51cto.com/u_11553781/5878746

相关文章

  • golang grpc使用示例
    疑问写前面grpc有内部对心跳的处理吗,还是说,双工需要自己作心跳管理,有懂的留言一下。SEO优化grpc如何双工通信?grpc如何从服务端推送消息给客户端?gprc环境如何搭建?grpc......
  • 消息队列中间件nsq安装与使用
    安装与运行nsq的镜像开启容器时并不是默认开启三个服务的,而是需要手动开启。dockerpullnsqio/nsqdockerrun-itd--restart=on-failure:20-p4150:4150-p4151:4151-p......
  • Union-Find算法
    目录Union-Find算法简介思路代码实现应用应用1:Leetcode.130题目分析代码实现Union-Find算法简介UnionFind算法用于处理集合的合并和查询问题,它定义了两个用于并查集的......
  • 最小生成树之普利姆算法与克鲁斯卡尔算法(贪心算法)
    最小生成树(贪心算法)概念一个有n个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。连通图有多种连接方式,而其中......
  • freertos消息队列的值传递和指针传递
    消息队列的使用方法总结:1、消息队列初始化(定义一个消息队列的结构体),一般在main.c中完成。2、消息队列的发送:  aextern消息队列   b定义一个结构体的指针指向消......
  • 【算法】最后一个单词的长度,颠倒二进制位,排列序列等三道题目
    颠倒二进制位题目描述颠倒给定的32位无符号整数的二进制位。提示:请注意,在某些语言(如Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并......
  • 384. 打乱数组(洗牌算法)
    给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是 等可能 的。实现 Solution class:Solution(int[]nums) 使用整数数......
  • go /golang 下生成protobuf *.pb.go文件 记录
      如果出现这个状况解决办法记录一下:在指定目录  gitclonehttps://github.com/golang/protobuf 下载源码   进入到以下目录  分别执行 以下图片......
  • 51 nod 算法马拉松28 先序遍历与后序遍历
     ​​先序遍历与后序遍历​​ ​​​Scape​​​ (命题人)​​​tangjz​​​ (测试)基准时间限制:1 秒空间限制:131072 KB分值: 40对于给定......
  • [译]Golang中JSON和结构体的组合使用
     原文地址:http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/ 假设你正在把一个JSON对象解码为Go的结构体。该JSON来自不受你控制的服......