【代码随想录——栈与队列】

1.栈和队列理论基础

栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出。
在这里插入图片描述

2.用栈实现队列

在这里插入图片描述

type MyQueue struct {
	head []int
	headSize int
	store []int
	storeSize int
}


func Constructor() MyQueue {
	return MyQueue{
		head : make([]int,100),
		headSize : 0,
		store : make([]int,100),
		storeSize : 0,
	}
}


func (this *MyQueue) Push(x int)  {
	this.store[this.storeSize] = x
	this.storeSize++
}


func (this *MyQueue) Pop() int {
	if this.headSize==0{
		//需要将store中的数倒过来
		for i:=this.storeSize;i>0;{
            i--
			this.head[this.headSize]=this.store[i]
            this.headSize++
		}
		this.storeSize = 0
	}
	if this.headSize>0{
		this.headSize--
		return  this.head[this.headSize]
	}
	return -1
}


func (this *MyQueue) Peek() int {
	if this.headSize==0{
		//需要将store中的数倒过来
		for i:=this.storeSize;i>0;{
            i--
			this.head[this.headSize]=this.store[i]
            this.headSize++
		}
		this.storeSize = 0
	}
	if this.headSize>0{
		return  this.head[this.headSize-1]
	}
	return -1
}


func (this *MyQueue) Empty() bool {
	return this.headSize==0&&this.storeSize==0
}

3.用队列实现栈

在这里插入图片描述

type MyStack struct {
    store []int
    size int
}

func remove(s []int, i int) []int {
    s[i] = s[len(s)-1]
    return s[:len(s)-1]
}

func Constructor() MyStack {
    return MyStack{make([]int,100),0}
}

func (this *MyStack) Push(x int)  {
    this.store[this.size]=x
    this.size++
}

func (this *MyStack) Pop() int {
    this.size--
    return this.store[this.size]
}

func (this *MyStack) Top() int {
    return this.store[this.size-1]
}

func (this *MyStack) Empty() bool {
    return this.size==0
}

4.有效的括号

在这里插入图片描述

func isValid(s string) bool {
	stack := Stack{}
	for i := 0; i < len(s); i++ {
		println(s[i])
		if s[i] == 40 || s[i] == 91 || s[i] == 123 {
			stack.Push(int(s[i]))
		} else {
			char, err := stack.Top()
			if err != nil {
				return false
			}
			if char == 40 && s[i] == 41 {
				stack.Pop()
				continue
			}
			if char == 91 && s[i] == 93 {
				stack.Pop()
				continue
			}
			if char == 123 && s[i] == 125 {
				stack.Pop()
				continue
			}
			return false
		}
	}
	if stack.Len() != 0 {
		return false
	}
	return true
}

type Stack []int

func (stack Stack) Len() int {
	return len(stack)
}

func (stack Stack) IsEmpty() bool {
	return len(stack) == 0
}

func (stack Stack) Cap() int {
	return cap(stack)
}

func (stack *Stack) Push(value int) {
	*stack = append(*stack, value)
}

func (stack Stack) Top() (int, error) {
	if len(stack) == 0 {
		return -1, errors.New("Out of index, len is 0")
	}
	return stack[len(stack)-1], nil
}

func (stack *Stack) Pop() (int, error) {
	theStack := *stack
	if len(theStack) == 0 {
		return -1, errors.New("Out of index, len is 0")
	}
	value := theStack[len(theStack)-1]
	*stack = theStack[:len(theStack)-1]
	return value, nil
}

5.删除字符串中的所有相邻重复项

在这里插入图片描述

func removeDuplicates(s string) string {
	chars := []byte(s)
	p1 := 0
	for i := 0; i < len(chars); i++ {
		if(p1>0 && chars[p1-1]==chars[i]){
			p1--
		}else{
			chars[p1] = chars[i]
			p1++
		}
	}
	return string(chars[:p1])
}

6.逆波兰表达式求值

在这里插入图片描述

func evalRPN(tokens []string) int {
    numIndex := -1
    numArr := make([]int,10000)
    for _,str := range(tokens){
        num, err := strconv.Atoi(str)
        if err==nil{
            //说明是数字
            numIndex++
            numArr[numIndex]=num
        }else{
            //说明是一个+-*/中的一种
            num1 := numArr[numIndex]
            numIndex--
            num2 := numArr[numIndex]
            switch str{
                case "+":
                    numArr[numIndex]=num1+num2
                case "-":
                    numArr[numIndex]=num2-num1
                case "*":
                    numArr[numIndex]=num1*num2
                case "/":
                    numArr[numIndex]=num2/num1
            }
        }
    }
    return numArr[0]
}

7.滑动窗口最大值

在这里插入图片描述
这道题目需要使用单调队列

// 封装单调队列的方式解题
// 那么这个维护元素单调递减的队列就叫做单调队列
// 即单调递减或单调递增的队列
type MyQueue struct {
	queue []int
}

func NewMyQueue() *MyQueue {
	return &MyQueue{
		queue: make([]int, 0),
	}
}

func (m *MyQueue) Front() int {
	return m.queue[0]
}

func (m *MyQueue) Back() int {
	return m.queue[len(m.queue)-1]
}

func (m *MyQueue) Empty() bool {
	return len(m.queue) == 0
}

// push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
func (m *MyQueue) Push(val int) {
	for !m.Empty() && val > m.Back() {
		m.queue = m.queue[:len(m.queue)-1]
	}
	m.queue = append(m.queue, val)
}

// pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
func (m *MyQueue) Pop(val int) {
	if !m.Empty() && val == m.Front() {
		m.queue = m.queue[1:]
	}
}

func maxSlidingWindow(nums []int, k int) []int {
	queue := NewMyQueue()
	length := len(nums)
	res := make([]int, 0)
	// 先将前k个元素放入队列
	for i := 0; i < k; i++ {
		queue.Push(nums[i])
	}
	// 记录前k个元素的最大值
	res = append(res, queue.Front())
	for i := k; i < length; i++ {
		// 滑动窗口移除最前面的元素
		queue.Pop(nums[i-k])
		// 滑动窗口添加最后面的元素
		queue.Push(nums[i])
		// 记录最大值
		res = append(res, queue.Front())
	}
	return res
}

8.前K个高频元素

在这里插入图片描述
这题目需要实现go中提供的heap的接口。使用大顶堆即可完成任务。

func topKFrequent(nums []int, k int) []int {
	items := make(map[int]*Item, 0)
	for i := 0; i < len(nums); i++ {
		item, ok := items[nums[i]]
		if !ok {
			items[nums[i]] = &Item{key: nums[i], value: 1}
		} else {
			item.value++
		}
	}

	hp := &ItemHeap{}
	heap.Init(hp)
	for _, value := range items {
		heap.Push(hp, *value)
	}

	res := make([]int, k)
	for i := 0; i < k; i++ {
		item := heap.Pop(hp)
		res[i] = item.(Item).key
	}
	return res
}


//大顶堆
type Item struct {
	// 排序的关键词
	key int
	// value,用来记录出现的次数
	value int
}

type ItemHeap []Item

func (h ItemHeap) Len() int {
	return len(h)
}

func (h ItemHeap) Swap(i, j int) {
	h[i], h[j] = h[j], h[i]
}

func (h ItemHeap) Less(i, j int) bool {
	return h[i].value > h[j].value
}

// 实现heap.Interface接口定义的额外方法
func (h *ItemHeap) Push(item interface{}) {
	*h = append(*h, item.(Item))
}

// 这个方法不是给用户使用的
func (h *ItemHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[0 : n-1]
	return x
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/606557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI智剪新风尚:一键操作,批量视频剪辑轻松入门

随着科技的飞速进步&#xff0c;人工智能(AI)已逐渐渗透到我们生活的各个领域&#xff0c;其中&#xff0c;AI视频剪辑技术的出现&#xff0c;为视频制作带来了革命性的变革。如今&#xff0c;一键操作、批量处理的AI智剪正成为视频剪辑的新风尚&#xff0c;让剪辑工作变得前所…

品牌舆情监测工作要怎么做?

一个负面舆论的传播&#xff0c;可能在短时间内对企业品牌形象造成巨大损害&#xff0c;甚至引发舆情危机。因此&#xff0c;如何有效地进行品牌舆情监测&#xff0c;成为企业不可忽视的问题。伯乐网络传媒多年网络公关、舆情监测经验&#xff0c;今天就来给大家分享一下。 一、…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-网络安全

&#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件设计师考点暴击 ⭐&#x1f170;️进入狂砍分⭐ ⭐软件设计师高频考点文档&#xff0c; ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ &#x1f3b6;&#xff08;A) 考点1&#xff0c;网络攻击 理解记忆 &#…

Kubernetes——基础认识

目录 一、简介 1.Kubernetes是什么 2.Kubernetes特性 2.1自我修复 2.2弹性伸缩 2.3自动部署和回滚 2.4服务发现和负载均衡 2.5机密和配置管理 2.6存储编排 2.7批量处理 二、Kubernetes架构与组件 1.Master 1.1Kube-ApiServer 1.2Kube-Scheduler调度器 1.3Kube-C…

机器学习(二) ----------K近邻算法(KNN)+特征预处理+交叉验证网格搜索

目录 1 核心思想 1.1样本相似性 1.2欧氏距离&#xff08;Euclidean Distance&#xff09; 1.3其他距离 1.3.1 曼哈顿距离&#xff08;Manhattan Distance&#xff09; 1.3.2 切比雪夫距离&#xff08;Chebyshev distance&#xff09; 1.3.3 闵式距离&#xff08;也称为闵…

OpenHarmony 4.0 实战开发——分布式任务调度浅析

1 概述 OpenHarmony 分布式任务调度是一种基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性的任务调度方式。它通过构建一种统一的分布式服务管理机制&#xff0c;包括服务发现、同步、注册和调用等环节&#xff0c;实现了对跨设备的应用进行远程启动、远程调用、…

ChatPPT开启高效办公新时代,AI赋能PPT创作

目录 一、前言二、ChatPPT的几种用法1、通过在线生成2、通过插件生成演讲者模式最终成品遇到问题改进建议 三、ChatPPT其他功能 一、前言 想想以前啊&#xff0c;为了做个PPT&#xff0c;我得去网上找各种模板&#xff0c;有时候还得在某宝上花钱买。结果一做PPT&#xff0c;经…

拼多多投产比怎么逐步调高

提高拼多多的投产比&#xff08;ROI&#xff09;需要综合考虑多个因素&#xff0c;包括点击量、转化率、客单价以及点击花费。以下是一些有效的方法&#xff1a; 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自…

Aigtek安泰电子邀您莅临2024中国微米纳米技术学会柔性电子技术与应用创新论坛

2024年5月18日-20日&#xff0c;中国微米纳米技术学会柔性电子技术与应用创新论坛将于深圳登席路国际酒店举办&#xff0c;届时Aigtek安泰电子将携一众明星产品及专业测试解决方案亮相本次论坛&#xff0c;我们诚邀您莅临No.A39展位参观、洽谈与观摩&#xff01; - 时间&#x…

8-3 html中的表单标签 select和textarea

跟学b站黑马程序员pink老师&#xff0c;之前发过长篇&#xff0c;太长不好阅读&#xff0c;拆分成短篇 8.4.3 select下拉表单元素 如果在页面中有多个选项让用户选择&#xff0c;并且想要节约页面空间&#xff0c;我们可以用<select>标签来定义下拉列表 1.<select&g…

HawkEye—高效、细粒度的大页管理算法

文章目录 HawkEye—高效、细粒度的大页管理算法1.作者简介2.文章简介与摘要3.简介(1).当时的SOTA系统概述LinuxFreeBSDIngens (2).HawkEye 4.动机(1).地址翻译开销与内存膨胀(2).缺页中断延迟与缺页中断次数(3).多处理器大页面分配(4).如何测算地址翻译开销&#xff1f; 5.设计…

搜维尔科技:OptiTrack是基于LED墙虚拟制作舞台的最佳选择

OptiTrack因其绝对精度、易用性、可靠性以及与现场工具的完美集成而被选中&#xff0c;仍然是全球首屈一指的基于 LED 墙的虚拟制作舞台的选择。 当今虚拟制作阶段的低延迟、超精确摄像机跟踪标准 /- 0.2 毫米 位置精度1 < 10 毫秒 系统延迟 /- 0.1 度 旋转精度2 电影…

Spring Boot集成Ldap快速入门Demo

1.Ldap介绍 LDAP&#xff0c;Lightweight Directory Access Protocol&#xff0c;轻量级目录访问协议. LDAP是一种特殊的服务器&#xff0c;可以存储数据数据的存储是目录形式的&#xff0c;或者可以理解为树状结构&#xff08;一层套一层&#xff09;一般存储关于用户、用户…

Linux实验 系统管理(一)

实验目的&#xff1a; 掌握Linux系统文件检索、排序、查找命令&#xff1b;掌握Linux系统文件的特殊权限及文件默认权限umask掩码&#xff1b;掌握Linux系统用户和组管理、配置文件和常用命令。 实验内容&#xff1a; 在VMware中启动已经安装好的CentOS&#xff0c;本地登录r…

Docker Compose常用命令与属性

大家好&#xff0c;今天给大家分享Docker Compose的常用命令&#xff0c;以及docker-compose文件的属性。Docker Compose 是一个用于定义和运行多容器 Docker 应用应用的重要工具。它通过一个配置文件&#xff08;docker-compose.yml&#xff09;来详细定义多个容器之间的关联、…

拼多多投产比高了好还是低了好

投产比是衡量店铺经济效益和可行性的重要指标&#xff0c;它通过比较投入和产出&#xff08;销售额&#xff09;来反映店铺的盈利能力&#xff0c;一个高的投产比意味着相对较小的投入获得了较大的销售额&#xff0c;表明店铺的经济效益较好。要提升投产比&#xff0c;商家可以…

模型查询器在使用别名后不能使用tp6

在我们定义了模型的查询器时&#xff0c;再通过模型进行连表加别名的时候&#xff0c;使用查询器&#xff0c;查询器会没办法使用&#xff1b; 那我们可以将查询器前缀增加表名或者__TABLE__ 以上两种方式都可以&#xff0c;个人建议使用__TABLE__&#xff0c;因为这个查询器可…

蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app

本文来自&#xff1a;蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app - 源码1688 卡券绿色循环计划—— 一项旨在构建卡券价值再利用生态的社会责任感项目。在当前数字化消费日益普及的背景下&#xff0c;大量礼品卡、优惠券因各种原因未能有效…

网络工程师必备:静态路由实验指南

大家好&#xff0c;这里是G-LAB IT实验室。今天带大家学习一下华为静态路由实验配置 01、实验拓扑 02、实验需求 1.R1环回口11,1,1.1模拟PC1 2.R2建立2个环回口模拟Server server-1: 22,1,1.1 server-2: 44.1.1.1 3.要求使用静态路由实现全网互通 PC1去往server-1从R3走…

HA-MAc,透明质酸-甲基丙烯酸酯可用于制备具有交联能力的透明质酸基材料

【基本信息】 Hyaluronate Methacrylate&#xff08;甲基丙烯酸酯化透明质酸&#xff0c;简称HA-MAc&#xff09;是一种重要的生物材料 中文名称&#xff1a;甲基丙烯酸酯化透明质酸、透明质酸-甲基丙烯酸酯 英文名称&#xff1a;Hyaluronate Methacrylate、HA-MAc 分子量&…