GO算法-栈队列转换之互通有无
栈:先进后出
时间复杂度:入出O(1),查找O(n)
使用场景:10进制转2进制
23 %2 = 1
11 %2 = 1
5 %2 = 1
2 %2 = 0
1 %2 = 1
tack = [1, 1, 1, 0, 1]
res = 1 0 1 1 1
复习下2进制转10进制:
1 0 1 1 1有5位
1 * 2^4 + 0 * 2^3 + 1*2^2 + 1*2^1 + 1*2^0
= 16 + 0 + 4 + 2 + 1
= 23
一:有效括号(20)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
func isValid(s string) bool {/**思路分析:左右闭合必然是偶数,单数直接返回从左遍历,如果是左边的括号,就放入栈中,当匹配右边的第一个括号,必然是和栈顶的是一套的,怎么判断是一套那,我们可以直接使用hash实现,利用map**///开始n:= len(s)if n%2 == 1 {return false}//利用ascii码,注意这里key一定要是有括号,因为下面判断是从最左边开始,所以存在有括号才是需要和栈顶数据对比,写反了下面逻辑也要修改var memory = map[byte]byte{')':'(','}':'{',']':'[',}stack := []byte{}for i:=0; i<n; i++ {//>0说明存在右括号,这时从栈顶取出做括号if memory[s[i]] > 0{if len(stack) == 0 || stack[len(stack)-1] != memory[s[i]] {return false}//取出栈顶的数据stack = stack[:len(stack) - 1]} else {//是做括号放到栈顶stack = append(stack, s[i])}}//栈没有数据说明匹配完毕if len(stack) == 0 {return true} else {return false}
}
二:用栈实现队列(232)
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
进阶:
你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。
示例:
输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]
解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
type MyQueue struct {queue1, queue2 []int
}func Constructor() (this MyQueue) {return
}func (this *MyQueue) Push(x int) {//栈先进后出,队列先进先出//写入前先把栈的数据放到临时中,然后写入到新的栈,如果检测到临时的栈有数据,就把数据放到当前栈中,比如按照栈输入的是2,3,4,5.栈输出是5,4,3,2.所以再把这个按照顺序保存到另一个栈就是,5,4,3,2输出就变成了2,3,4,5。因为栈是先输出最后一个也就是 queue(len(queue)-1)//原本234现在2345this.queue2 = append(this.queue2, x)//开始保存到queue1,每次插入清空queue1,重新同步queue2this.queue1 = []int{}for i:=0; i< len(this.queue2); i++ {this.queue1 = append(this.queue1, this.queue2[len(this.queue2) - i - 1])}
}func (this *MyQueue) Pop() int {v := this.queue1[len(this.queue1) - 1]//1//这里一定要注意。。因为1和2是反转的,所以1移出最后一个,2就应该移出第一个//1:1234,2:4321this.queue1 = this.queue1[:len(this.queue1) - 1]this.queue2 = this.queue2[1:]return v
}func (this *MyQueue) Peek() int {//栈只能从栈顶出数据,但是这个是队列的第一个出的return this.queue1[len(this.queue1) - 1]
}func (this *MyQueue) Empty() bool {return len(this.queue1) == 0
}/*** Your MyQueue object will be instantiated and called as such:* obj := Constructor();* obj.Push(x);* param_2 := obj.Pop();* param_3 := obj.Peek();* param_4 := obj.Empty();*/
GO算法-栈队列转换之互通有无相关推荐
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)
C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...
- 数据结构与算法-栈与队列
数据结构与算法-栈与队列 栈 基本概念 简单表述就是仅在表尾进行插入和删除操作的线性表. 常见操作 入栈和出栈, 均在线性表的尾部进行. 基本原则就是, 先入后出. 队列 基本概念 和栈不同的是,队列 ...
- 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!
链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...
- java数据结构 队列_Java数据结构与算法[原创]——队列
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...
- c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc
数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...
- 栈,队列和链表三者之间的关系与区别
最近一直在学习算法,刷算法题,但是自从大学毕业以来,数据结构的知识都还给老师了,只会个数组,所以前期刷的题目也都是有关数组的 最近跟着小册重学了一遍数据结构,今天就记录一下栈,队列和链表三者之间的关系 ...
- 数据结构与算法:队列——02
文章目录 三.队列 1.队列概述: 2.单向队列[数组表现形式]: 3.环形队列[数组表现形式]: 三.队列 1.队列概述: 定义: 队列定义 队列简称队,它也是一种操作受限的线性表.其限制为仅允许在 ...
- java 栈 队列 接口_Java队列接口
java 栈 队列 接口 介绍: 队列是FIFO(先进先出)抽象数据类型(ADT). 换句话说,按插入顺序将元素删除. java.util.Queue是Java 中的接口,并且从java.util.C ...
最新文章
- celery源码分析-定时任务
- 多级反馈队列列算法的定义
- python与excel的关系-Python与Excel交互——Xlwings
- 编程之美-最大公约数问题方法整理
- everedit选择_EverEdit(文本编辑器)
- PHP服务器脚本实例,Shell脚本实现的一个简易Web服务器例子分享_linux shell
- Python编程专属骚技巧9
- github 国内加速镜像
- 云图说丨手把手教你为容器应用配置弹性伸缩策略
- Spring Security 3多用户登录实现之二 多登录界面展示
- activity和service之间的相互通信方法
- [React-Native]环境配置amp;HelloWorld
- 静态资源文件自动压缩并替换成压缩版本(大型网站优化技术)
- knockout + require + director 构建单页面程序(director)
- 优雅降级实现IE8的transform平移属性
- MySQL查询以逗号隔开的字符串
- 只用html如何实现音乐播放,如何使用html实现音乐播放
- 有一个人有一百块钱, 打算买一百只鸡, 现在大鸡三块钱一只, 小鸡一块钱三只, 不大不小的鸡两块钱一只. Java编程实现,刚好用一百块钱买一百只鸡.
- js实现夜空 干货比较多
- oracle更新右数第一位,Oracle数据库基本查询语句
热门文章
- screw (螺丝钉) 数据库表结构文档生成工具(转发)
- Ktor2.0很多新特性,我们一年前就想到了,并已落实在项目中
- 【python】python编译器以及安装
- 联想基于OpenStack的高可用企业云平台实践
- 计算机网络如何促进幼儿教师专业发展,新学期计算机网络实训报告范文与新幼儿教师的述职报告合集.doc...
- android版本玩游戏卡怎么办,阴阳师安卓卡顿不流畅怎么办 玩阴阳师卡顿怎么解决...
- 如何查询Office版本号
- 【人体骨骼点】数据集
- 【高防服务器租用】这里有一份服务器租用攻略,请收好!
- 微信小程序之js模块化