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

news2024/12/23 14:54:35

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
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…

qt for android 无法进入调试c++代码解决方法

1.上一篇文章介绍了qt 5.15.13配合NDK25 的解决方法&#xff0c;但是还存在一个问题是可以调试qml代码但是无法进入c代码中。 在网上进行搜索&#xff0c;得到的答案是确实存在这个问题&#xff0c;包括这个qt6版本。 2.看来这个问题没有办法了&#xff0c;静下来思考下。这个…

AI助力临沂商贸的世界语言

“你好”“Bonjour”“Hola”……“中国老板娘”能够流利运用 17 种语言&#xff0c;近日在海外爆火。借由 AI 技术的助力&#xff0c;商家在镜头前自如切换各国语言&#xff0c;与来自全球各地的外商实现无障碍的沟通交流。这种现象背后&#xff0c;是 AI 技术对传统商贸模式的…

Python 控制 Keysight (原Agilent) 直流电源

前言 直流电源是如图型号,是keysight 6631系列;由于本身直流电源的功能也不复杂,所以控制起来相对比较简单,本来不想写这篇文章的,但是想想还是做一个简单的记录吧! 硬件环境结构图: 通信方式:由于该直流电源只GPIB接口,所以是通过GPIB线与设备进行通信 实现原理: …

中国网安上市公司2023财报摘要及启示

随着国内网络安全市场越来越来越来越卷&#xff0c;出海&#xff0c;从原来的陌生遥远不看好&#xff0c;已经成为许多厂商不得不思考的一个新方向。 阻力不变。 地缘政治问题依然存在&#xff0c;沟通成本高&#xff0c;对产品成熟度要求高&#xff0c;对团队背景和公司整体能…

如何通过OMS加快大表迁移至OceanBase

OMS&#xff0c;是OceanBase官方推出的数据迁移工具&#xff0c;能够满足众多数据迁移场景的需求&#xff0c;现已成为众多用户进行数据迁移同步的重要工具。OMS不仅支持多种数据源&#xff0c;还具备全量迁移、增量同步、数据校验等功能&#xff0c;并能够对分表进行聚合操作&…

文件操作

前言&#xff1a; 文件内容属性 要向访问文件就要打开文件——>用进程来打开——>要把文件先加载到内存中——> 一个进程可以打开多个文件&#xff0c;OS中也有可能多个进程打开了多个文件 文件以多&#xff0c;就需要进行管理&#xff0c;——先描述再组织 没有被打开…

基于Spring Boot框架实现大学生选课管理系统

文章目录 源代码下载地址项目介绍项目功能界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 教务处管理 开课、开班审批&#xff0c;排课处理&#xff0c;班级操作&#xff0c;选课时间段管理** 使用了sql解决了开课开班的时间段的冲突…

基于PHP后台微信图书馆借书还书小程序系统设计与实现

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

IDM下载器激活

文章目录 1、Internet Download Manager简介2、Internet Download Managery应用3、Internet Download Managery下载 1、Internet Download Manager简介 Internet Download Manager (IDM) 是一款功能强大的下载管理软件&#xff0c;旨在帮助用户更高效地管理和加速其下载任务。它…

【硬件开发】原型设计对于成功产品开发重要性及常见阶段

电子产品的设计与开发始于原型制作阶段。这些原型虽可能与最终产品极为相似&#xff0c;但总带有实验性质&#xff0c;因为电子原型的制作过程包括对新概念、新思想及新解决方案的测试。虽然存在出错的风险&#xff0c;跳过这一阶段可能会导致不必要的开支。不擅长电子硬件设计…

CSS和JavaScript

CSS 在html中引入CSS 我们需要先在该项目先建立css文件 html引入CSS,在<head></head>中添加<link>标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" co…

QT--4

QT 使用定时器完成闹钟 #include "widget.h" #include "ui_widget.h"void Widget::timestart() {timer.start(1000); }void Widget::timeend() {timer.stop(); }Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(t…

电商核心技术揭秘52:数字化内容营销创新

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

火爆开展齐力控股集团带您了解2024年第13届生物发酵展

参展企业介绍 齐力控股集团专业生产高精度卫生级不锈钢设备配件及管道所有连接件、锻造、精加工一站式服务。产品广泛适用于制药、饮料、乳制品、啤酒、生物化工等领域。所有产品均按3A、SMS、DIN、RJT、IDF、DS等标准制造&#xff0c;所有产品均达到GMP药典要求。我们是一家有…

【LeetCode刷题记录】简单篇-110-平衡二叉树

【题目描述】 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 。 【测试用例】 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true 示例2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;false …

基于Vue3与ElementUI Plus酷企秀可视化设计器中的创新应用

一、引言 随着科技的快速发展&#xff0c;前端技术已经从简单的网页呈现进化到了复杂的数据可视化、互动体验和跨平台应用的构建。酷企秀可视化设计器作为一个集成了多种前端技术的创新平台&#xff0c;不仅为企业提供了全方位的数字化展示解决方案&#xff0c;还在多个行业领…

新产品Spiff来啦!Salesforce将最新收购加入Sales Cloud!

Salesforce在过去一年中一直处于收购间歇期&#xff0c;但这并没有妨碍Salesforce在2023年底收购了Spiff。Spiff是新型激励薪酬管理(Incentive Compensation Management&#xff0c;ICM) 软件提供商 &#xff0c;是AppExchange合作伙伴&#xff0c;结合直观的低代码UI、熟悉的电…

车载测试系列:车载测试Bug定位与分析

车载Bug定位 1.1 模拟复现条件 能够复现bug才能对问题进行定位、解决以及验证。找到bug存在的特定的条件&#xff0c;进行重现。对于依赖外部输入的条件&#xff0c;如果条件比较复杂难以模拟可以在程序里预设直接进入对应状态。 1.2 打印Log 根据问题的现象&#xff0c;在…

配置完串口,用了printf函数,LCD屏不显示了

配置完串口后&#xff0c;记得打开微库&#xff01; /* USER CODE BEGIN PFP */u8 rx[2];u8 rx_buff[10];int fputc(int c, FILE* s){u8 ch[1] {c};HAL_UART_Transmit(&huart1,ch, 1, 0xfff);return c; } /* USER CODE END PFP */