[代码随想录]Day10-栈与队列part02

题目:20. 有效的括号

思路:

很简单的一个栈的题目:

  1. 如果是左括号就存
  2. 如果是右括号就和栈顶的匹配
    1. 匹配失败就返回false
    2. 匹配成功就删除栈顶元素
  3. 如果结束后是空就说明匹配完成

这里需要注意的一个点是可以用map来代替过多的if else,希望能学会!

代码:

var pairs = map[byte]byte { // 做一个映射存储方便
    ')' : '(',
    ']' : '[',
    '}' : '{',
}
func isValid(s string) bool {
    stack := []byte{}
    lens := 0 // 可以不用频繁的查询len(stack)
    for i:=0; i < len(s); i++ {
        if s[i] == '[' || s[i] == '{' || s[i] == '(' { // 左括号存
            stack = append(stack, s[i])
            lens++
        }else if lens != 0 && stack[lens-1] == pairs[s[i]] { // 右括号匹配成功就删
            stack = stack[:lens-1]
            lens--
        }else { // 匹配失败就false
            return false
        }
    }
    return lens == 0 // 是0才能true,因为可能剩下左括号
}

参考:

代码随想录

题目:1047. 删除字符串中的所有相邻重复项

思路:

和上面的题目一样都是匹配的问题,直接看注释

代码:

func removeDuplicates(s string) string {
    stack := []byte{} 
    lens := 0
    for i := 0; i < len(s); i++ {
        if lens == 0 { // 如果还没有元素就直接添加
            stack = append(stack, s[i])
            lens++
        }else if stack[lens-1] == s[i] { // 和上一个元素相同就删
            stack = stack[:lens-1]
            lens--
        }else { // 和上一个不同就加
            stack = append(stack, s[i])
            lens++  
        }
    }
    return string(stack) // 转string类型
}

参考:

代码随想录

题目:150. 逆波兰表达式求值

思路:

题目不是很难,我要在这里学会的是如何去简化或者说提高代码的扩展性,比如对于运算符的判断以及对于加减乘除的计算。

详细看注释

代码:

var isOper = map[string]bool { // 判断是不是运算符
    "+" : true,
    "-" : true,
    "*" : true,
    "/" : true,
}
func evalRPN(tokens []string) int {
    number := []int{}
    lens := 0
    for _, v := range tokens {
        if _, ok := isOper[v]; ok { // 是运算符就操作
            a := number[lens-2] // 取出倒数第二个数
            b := number[lens-1] // 取出倒数第一个数
            number[lens-2] = Calc(a, b, v) // 把结果存在倒数第二个位置 
            number = number[:lens-1] // 删除倒数第一个位置
            lens-- // 元素-1
        }else {
            t, _:= strconv.Atoi(v) // string转int
            number = append(number, t) // 添加到数字中
            lens++  // 元素+1
        }
    }
    return number[0] // 最后剩下一个元素就是结果
}

func Calc(a,b int, op string) int { // 根据运算符进行运算
    if op == "+" {
        return a + b
    }else if op == "-" {
        return a - b
    }else if op == "*" {
        return a * b
    }else if op == "/" {
        return a / b
    }
    return 0
}

参考:

代码随想录

posted @   WtcSky  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示