算法篇:栈之常见题型
时间:2022-07-24
本文章向大家介绍算法篇:栈之常见题型,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法:
栈算是比较常见 的一种数据结构,先进后出,一般操作步骤如下:
1. 建立一个栈,golang中往往使用slice来操作
2. 满足条件的元素入栈
3. 出栈的时候一般都是最后一个入栈的元素,这里需要调节元素的位置
题目1: 有效的括号
https://leetcode-cn.com/problems/valid-parentheses/
代码实现:
func isValid(s string) bool {
if len(s)%2 == 1 {
return false
}
cc := []byte(s)
var satckStr []byte
for _, d := range cc {
if d == '(' || d== '{' || d == '[' {
satckStr = append(satckStr,d)
} else {
// ),],}这几个符号需要判断合法性
last := len(satckStr)-1
if ok := popStrOk(d,satckStr,last); !ok {
return false
}
satckStr = satckStr[:last]
}
}
if len(satckStr) != 0 {
return false
}
return true
}
func popStrOk(d byte, satckStr []byte, last int) bool{
if len(satckStr) == 0 {
return false
}
switch d {
case ')':
if satckStr[last] != '(' {
return false
}
case ']':
if satckStr[last] != '[' {
return false
}
case '}':
if satckStr[last] != '{' {
return false
}
default:
return false
}
return true
}
/*
解题思路:用栈来操作
1.先初步过滤掉数据,将奇数的字符串丢掉
2.遍历字符串,将(,[,{入栈
3.右括号出栈,判断是否有对应的做括号匹配(备注:考虑栈为空的时候)
4.都处理完了,栈非空为false,否则为true
*/
执行结果:
题目2: 删除最外层的括号
https://leetcode-cn.com/problems/remove-outermost-parentheses/
代码实现:
func removeOuterParentheses(S string) string {
strs := []byte(S)
len := len(strs)
L,R := 0,0
var stacks []byte
for i := 0; i < len; i++{
if strs[i]=='(' {
L++
} else {
R++
}
if R != L && L != 1{ // L==1表示的是最左边的左括号
stacks =append(stacks,strs[i])
} else if R == L { // 这个是最右边的右括号,不入栈
L,R = 0,0
}
}
return string(stacks)
}
/*
栈实现:利用左右括号的数量相同条件,
L == R的时候,表示的是找到了源语句
L!=R的时候,进行入栈,不过记得不要将最开始的左括号和最右边的右括号入栈
*/
执行结果:
题目3: 最小栈
https://leetcode-cn.com/problems/min-stack/
代码实现:
/*
关键点是最小值的获取,用栈
Mins作为一个有序数列,最后一位表示的是最小值,以第一次入栈的元素作为标识,
后续进来的元素小于等于它,放到数组末尾。
出栈的时候,只有出栈的数据是小于等于Mins中的最小元素的,才会出栈
备注:注意第一个入栈元素是必须要入栈的
*/
type MinStack struct {
Arr []int
Mins []int
}
/** initialize your data structure here. */
func Constructor() MinStack {
return MinStack{}
}
func (this *MinStack) Push(x int) {
this.Arr = append(this.Arr,x)
if len(this.Mins) == 0 || x <= this.Mins[len(this.Mins)-1] {
this.Mins = append(this.Mins,x)
}
return
}
func (this *MinStack) Pop() {
if len(this.Arr) == 0 {
return
}
last := len(this.Arr)-1
if this.Arr[last] <= this.Mins[len(this.Mins)-1] {
this.Mins = this.Mins[:len(this.Mins)-1]
}
this.Arr = this.Arr[:last]
return
}
func (this *MinStack) Top() int {
return this.Arr[len(this.Arr)-1]
}
func (this *MinStack) GetMin() int {
return this.Mins[len(this.Mins)-1]
}
执行结果:
- Python应用03 使用PyQT制作视频播放器
- struts2(三)之表单参数自动封装与参数类型自动转换
- mysql benchmark基准测试
- redis 学习笔记(6)-cluster集群搭建
- redis 学习笔记(6)-cluster集群搭建
- dubbox REST服务使用fastjson替换jackson
- JavaScript中removeEventListener()使用注意事项
- dubbox REST服务使用fastjson替换jackson
- struts2(二)之配置文件详解与结果视图
- CSS魔法堂:你真的懂text-align吗?
- 黑客可以利用传感器数据来破解手机密码
- spring-boot 速成(3) actuator
- 利用sharding-jdbc分库分表
- 利用sharding-jdbc分库分表
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法