刷题笔记day11-栈与队列2

这篇具有很好参考价值的文章主要介绍了刷题笔记day11-栈与队列2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

20. 有效的括号

这个是典型的使用栈,来进行匹配。
因为栈是先进后出,所以,最近的左括号一定在栈顶。如果不是,则就是不匹配了。

func isValid(s string) bool {
    stack := Stack{}
    dict := map[byte]byte {
        ')': '(',
        ']': '[',
        '}': '{',
    }
    for _, item := range []byte(s) {
        if leftVal, ok := dict[item]; ok {
            if stack.pop() != leftVal {
                return false
            }
        } else {
            stack.push(item)
        }
    }
    return stack.length == 0
}

type Stack struct {
    data []byte
    length int
}

func (s *Stack) pop() (v byte) {
    if s.length < 1 {
        return 
    }
    v = s.data[s.length-1]
    s.data = s.data[:s.length-1]
    s.length--
    return 
}

func (s *Stack) push(v byte) {
    s.data = append(s.data, v)
    s.length++
} 

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

func removeDuplicates(s string) string {
    // 思路:和栈顶不等的时候,
    s2 := []byte(s)
    stack := Stack{}
    stack.push(s2[0])

    for i := 1; i < len(s2); i++ {
        if v := stack.top(); v != s2[i] {
            stack.push(s2[i])
        } else {
            stack.pop()
        }
    }
    return string(stack.data)
}

type Stack struct {
    data []byte
    length int
}

func (s *Stack) pop() (v byte) {
    if s.length < 1 {
        return 
    }
    v = s.data[s.length-1]
    s.data = s.data[:s.length-1]
    s.length--
    return 
}

func (s *Stack) top() (v byte) {
    if s.length < 1 {
        return 
    }
    v = s.data[s.length-1]
    return 
}

func (s *Stack) push(v byte) {
    s.data = append(s.data, v)
    s.length++
} 

题目中是连续两个重复字符才删除,那么是多个重复字符如何删除呢?
可以增加一个last_char 变量,存放着上一次的结果。

s2 := []byte(s)
stack := Stack{}
stack.push(s2[0])
var lastChar = s2[0]
for i := 1; i < len(s2); i++ {
    v := stack.top()
    if v == s2[i] {
        stack.pop()
    } else if (v != lastChar) && (v != s2[i]) {
        // 和上一次字符相同时,不需要入栈
        stack.push(s2[i])
    }
}
return string(stack.data)

6. 逆波兰表达式求值

逆波兰表达式是一种后缀表达式,运算符号在后面,前面俩是运算数。

本质上还是使用栈来进行取值,然后运算。文章来源地址https://www.toymoban.com/news/detail-744919.html

import "strconv"

func evalRPN(tokens []string) int {
    // 思路:符号就退出两个数字,然后运算既可
    stack := Stack{}
    var (
        s1 int
        s2 int
        result int
    )
    for _, val := range tokens {
        if val == "+" || val == "-" || val == "*" || val == "/" {
            s2 = stack.pop()
            s1 = stack.pop()
            if val == "+" {
                stack.push(s1 + s2)
            } else if val == "-" {
                stack.push(s1 - s2)
            } else if val == "*" {
                stack.push(s1 * s2)
            } else if val == "/" {
                stack.push(s1 / s2)
            }
        } else {
            intVal, _ := strconv.Atoi(val)
            stack.push(intVal)
        }
    }
    result = stack.pop()
    return result
}


type Stack struct {
    data []int
    length int
}

func (s *Stack) pop() (v int) {
    if s.length < 1 {
        return 
    }
    v = s.data[s.length-1]
    s.data = s.data[:s.length-1]
    s.length--
    return 
}

func (s *Stack) top() (v int) {
    if s.length < 1 {
        return 
    }
    v = s.data[s.length-1]
    return 
}

func (s *Stack) push(v int) {
    s.data = append(s.data, v)
    s.length++
} 

到了这里,关于刷题笔记day11-栈与队列2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录笔记--栈与队列篇

    目录 1--用栈实现队列 2--用队列实现栈 3--有效的括号 4--删除字符串中的所有相邻重复项 5--逆波兰表达式求值 6--滑动窗口的最大值 7--前k个高频元素 利用两个栈,一个是输入栈,另一个是输出栈 ; 主要思路:         弹出栈顶元素时,需要将队列前 size - 1 个元素先弹出再

    2024年02月10日
    浏览(44)
  • 数据结构和算法(4):栈与队列

    栈(stack)是存放数据对象的一种特殊容器,其中的数据元素按线性的逻辑次序排列,故也可定义首、末元素。 尽管栈结构也支持对象的插入和删除操作,但其操作的范围仅限于栈的某一特定端。 也就是说,若约定新的元素只能从某一端插入其中,则反过来也只能从这一端删

    2024年02月09日
    浏览(47)
  • C++数据结构与算法——栈与队列

    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注! 请你仅使用两个栈实现先入先出队列。队列应当

    2024年02月20日
    浏览(43)
  • 【夜深人静学数据结构与算法 | 第九篇】栈与队列

    目录 ​前言: 栈: 栈的实际应用:  队列: 队列的实际应用: 总结:         栈与队列是我们学习的两个经典的数据结构,这两个数据结构应用广泛,在计算机内有很多底层应用,而很多算法也是依靠栈和队列来实现的,因此我们要想学好数据结构与算法,就要学好栈与

    2024年02月15日
    浏览(42)
  • 【C/C++数据结构与算法】C语言栈与队列

    目录 一、栈 二、队列 三、循环队列 特性: 顺序存储,后进先出 优点是可随机访问,尾部增删效率高 缺点是可能会浪费空间,不知道头部增删 特性: 链式存储,先进先出 优点是无空间浪费,头部增删效率高 缺点是不能随机访问,尾部增删效率低 特性: 顺序存储,先进先

    2024年02月09日
    浏览(60)
  • LeetCode刷题笔记【26】:贪心算法专题-4(柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球)

    参考前文 参考文章: LeetCode刷题笔记【23】:贪心算法专题-1(分发饼干、摆动序列、最大子序和) LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II) LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖

    2024年02月09日
    浏览(45)
  • 代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值

    题目详细思路和解法来自于:代码随想录 (programmercarl.com) 这道题分为三种情况 1.左括号多了         ([{}]() 2.括号不匹配         [{(]}] 3.右括号多了         []{}()))) 处理思路:我们在遇到左括号的时候,直接入栈其对应的右括号即可,然后在遇到右括号的时候直接与栈顶元素比

    2024年02月06日
    浏览(141)
  • 算法基础复盘笔记Day11【动态规划】—— 区间DP、计数类DP、树形DP、记忆化搜索

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2024年02月01日
    浏览(41)
  • 【算法刷题】Day28

    原题链接 第 i 个元素是一支给定的股票在第 i 天的价格 最多可以完成 两笔 交易 注意:你不能同时参与多笔交易 1. 状态表示: dp[i] 表示:第 i 天结束之后,所能获得的最大利润 f[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于“买入”状态下的,最大利润 g[i][j]

    2024年02月02日
    浏览(41)
  • 刷题笔记 day6

     对于一个递增排序的数组,我们可以使用双指针; 定义指针 left 指向数组最左端元素 , 定义指针 right 指向数组最右端元素; 当 nums[left] + nums[right]    target 时,右移指针right; 当 nums[left] + nums[right]   target 时,左移指针left; 当 nums[left] + nums[right]  ==  target 时,输出结果。

    2024年02月13日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包