栈:先进后出

时间复杂度:入出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算法-栈队列转换之互通有无相关推荐

  1. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  2. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  3. 数据结构与算法-栈与队列

    数据结构与算法-栈与队列 栈 基本概念 简单表述就是仅在表尾进行插入和删除操作的线性表. 常见操作 入栈和出栈, 均在线性表的尾部进行. 基本原则就是, 先入后出. 队列 基本概念 和栈不同的是,队列 ...

  4. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!

    链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...

  5. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  6. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  7. 栈,队列和链表三者之间的关系与区别

    最近一直在学习算法,刷算法题,但是自从大学毕业以来,数据结构的知识都还给老师了,只会个数组,所以前期刷的题目也都是有关数组的 最近跟着小册重学了一遍数据结构,今天就记录一下栈,队列和链表三者之间的关系 ...

  8. 数据结构与算法:队列——02

    文章目录 三.队列 1.队列概述: 2.单向队列[数组表现形式]: 3.环形队列[数组表现形式]: 三.队列 1.队列概述: 定义: 队列定义 队列简称队,它也是一种操作受限的线性表.其限制为仅允许在 ...

  9. java 栈 队列 接口_Java队列接口

    java 栈 队列 接口 介绍: 队列是FIFO(先进先出)抽象数据类型(ADT). 换句话说,按插入顺序将元素删除. java.util.Queue是Java 中的接口,并且从java.util.C ...

最新文章

  1. celery源码分析-定时任务
  2. 多级反馈队列列算法的定义
  3. python与excel的关系-Python与Excel交互——Xlwings
  4. 编程之美-最大公约数问题方法整理
  5. everedit选择_EverEdit(文本编辑器)
  6. PHP服务器脚本实例,Shell脚本实现的一个简易Web服务器例子分享_linux shell
  7. Python编程专属骚技巧9
  8. github 国内加速镜像
  9. 云图说丨手把手教你为容器应用配置弹性伸缩策略
  10. Spring Security 3多用户登录实现之二 多登录界面展示
  11. activity和service之间的相互通信方法
  12. [React-Native]环境配置amp;HelloWorld
  13. 静态资源文件自动压缩并替换成压缩版本(大型网站优化技术)
  14. knockout + require + director 构建单页面程序(director)
  15. 优雅降级实现IE8的transform平移属性
  16. MySQL查询以逗号隔开的字符串
  17. 只用html如何实现音乐播放,如何使用html实现音乐播放
  18. 有一个人有一百块钱, 打算买一百只鸡, 现在大鸡三块钱一只, 小鸡一块钱三只, 不大不小的鸡两块钱一只. Java编程实现,刚好用一百块钱买一百只鸡.
  19. js实现夜空 干货比较多
  20. oracle更新右数第一位,Oracle数据库基本查询语句

热门文章

  1. screw (螺丝钉) 数据库表结构文档生成工具(转发)
  2. Ktor2.0很多新特性,我们一年前就想到了,并已落实在项目中
  3. 【python】python编译器以及安装
  4. 联想基于OpenStack的高可用企业云平台实践
  5. 计算机网络如何促进幼儿教师专业发展,新学期计算机网络实训报告范文与新幼儿教师的述职报告合集.doc...
  6. android版本玩游戏卡怎么办,阴阳师安卓卡顿不流畅怎么办 玩阴阳师卡顿怎么解决...
  7. 如何查询Office版本号
  8. 【人体骨骼点】数据集
  9. 【高防服务器租用】这里有一份服务器租用攻略,请收好!
  10. 微信小程序之js模块化