博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leet-go]-使用栈实现队列操作
阅读量:2055 次
发布时间:2019-04-28

本文共 1271 字,大约阅读时间需要 4 分钟。

文章目录

用两个栈实现一个队列:

  • 实现添加appendTail(在队列尾部插入整数)与删除deleteHead(在队列头部删除整数)函数的功能;
  • 若队列中没有元素,deleteHead 操作返回-1;

题解分析

队列是先进先出,而栈是先进后出;为了能使队列移除头部元素,就需要保证栈顶元素是最先进入的元素:

  • 使用双队列:一个存放正常入队的元素的input,另外一个存放倒序元素(从第一个出栈,再入栈即为倒序)的output;
  • 入队:直接加入栈input即可;
  • 出队:若output不为空,则弹出栈顶元素;否则,若input为空返回-1,不为空则经input中元素放入output中(一个个从input出栈,然后入栈output),再弹出栈顶元素;

复杂度:

  • 时间:appendTail,直接入栈input,所以为O(1);deleteHead需要把N个元素倒序,在O(N)级别;
  • 空间:最差也是所有元素在栈中,即O(N);

代码实现

golang中没有默认的stack库,使用切片模拟(只在尾部插入与删除):

  • 插入时用append;
  • 删除时通过切片操作实现;

队列定义:

type CQueue struct {
Input []int Output []int}

在使用队列前,需要先通过Constructor构造出队列:

func Constructor() CQueue {
//instance := new(CQueue) instance := CQueue{
Input: make([]int, 0), Output: make([]int, 0), } return instance}func (this *CQueue) AppendTail(value int) {
this.Input = append(this.Input, value)}func (this *CQueue) DeleteHead() int {
if len(this.Output) == 0 {
for index := len(this.Input) - 1; index >= 0; index-- {
this.Output = append(this.Output, this.Input[index]) } this.Input = this.Input[:0] } size := len(this.Output) if size == 0 {
return -1 } result := this.Output[size-1] this.Output = this.Output[:size-1] return result}func TestQueue() {
qu := Constructor() qu.AppendTail(1) qu.AppendTail(2) fmt.Println(qu.DeleteHead())}

转载地址:http://qwilf.baihongyu.com/

你可能感兴趣的文章
Istio 1.3 发布,HTTP 遥测不再需要 Mixer
查看>>
Kubernetes Dashboard 终结者:KubeSphere
查看>>
AdGuard Home 安装使用教程
查看>>
Porter:面向裸金属环境的 Kubernetes 开源负载均衡器
查看>>
Kubernetes Dashboard 终结者:KubeSphere
查看>>
手把手教你部署 Istio 1.3
查看>>
CentOS 8 都发布了,你还不会用 nftables?
查看>>
一点也不流氓的搜狗输入法皮肤
查看>>
Grafana 6.4 正式发布!
查看>>
etcd 性能测试与调优
查看>>
Docker 大势已去,Podman 万岁
查看>>
Podman 使用指南
查看>>
国内 2018 年 12 月 XX 站访问百强榜单
查看>>
Linux Capabilities 入门教程:概念篇
查看>>
Linux Capabilities 入门:让普通进程获得 root 的洪荒之力
查看>>
为什么我会了SOA,你们还要逼我学微服务?
查看>>
Linux Capabilities 入门:如何管理文件的 capabilities?
查看>>
Linux Capabilities 入门教程:基础实战篇
查看>>
如何向纯洁的女朋友解释并发与并行的区别?
查看>>
一名云原生搬砖师的自白
查看>>