第十天 2021-3-12 每日刷四题
刷题模块:栈 - 简单难度

一、STL:stack

C++ stack(STL stack)用法详解

函数 方法
top() 返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
push(const T& obj) 可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
push(T&& obj) 以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
pop() 弹出栈顶元素。
size() 返回栈中元素的个数。
empty() 在栈中没有元素的情况下返回 true。
emplace() 用传入的参数调用构造函数,在栈顶生成对象。
swap(stack & other_stack) 将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于 stack 对象有一个特例化的全局函数 swap() 可以使用。

二、C++ 单引号和双引号

单引号是字符型, 双引号是字符串型
单引号引起的一个字符实际上代表一个整数。
双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针。该数组会被双引号之间的字符以及一个额外的二进制为零的字符 ‘\0’ 初始化。
c++中的 单引号和双引号

应用

char ch="A";
switch(){// "A" 为字符串,语法报错
case "A":
// 'A' 为字符,正确
case 'A':
}

三、【题】有效的括号

直接放优化过后的代码,做了如下优化,形式和逻辑优化不再提,重点为方法优化。

  1. 使用unordered_map的键值对来存储括号对,判断时简化了代码量,使逻辑更加清晰,结构更加严谨。
  2. 使用count()函数而不是find()==end()函数判断使得代码更加简洁。
class Solution {public:bool isValid(string s) {stack<char> Stack;unordered_map<char,char> hash{{')','(',},{']','['},{'}','{'}};for(auto &x:s){if(!hash.count(x)) Stack.push(x);else if(Stack.empty() || Stack.top()!=hash[x])return false;else Stack.pop();}return Stack.empty();}
};

四、【题】最小栈

官方解法:使用辅助栈,记录每个元素入栈时,该状态下的最小值

栈只会pop栈顶的元素,辅助栈同时pop栈顶即可

class MinStack {stack<int> x_stack;stack<int> min_stack;
public:MinStack() {min_stack.push(INT_MAX);}void push(int x) {x_stack.push(x);min_stack.push(min(min_stack.top(), x));}void pop() {x_stack.pop();min_stack.pop();}int top() {return x_stack.top();}int getMin() {return min_stack.top();}
};

面试的时候被问到不能用额外空间,就去网上搜了下不用额外空间的做法。思路是栈里保存差值。

十分的妙

class MinStack:def __init__(self):"""initialize your data structure here."""self.stack = []self.min_value = -1def push(self, x: int) -> None:if not self.stack:self.stack.append(0)self.min_value = xelse:diff = x-self.min_valueself.stack.append(diff)self.min_value = self.min_value if diff > 0 else xdef pop(self) -> None:if self.stack:diff = self.stack.pop()if diff < 0:top = self.min_valueself.min_value = top - diffelse:top = self.min_value + diffreturn topdef top(self) -> int:return self.min_value if self.stack[-1] < 0 else self.stack[-1] + self.min_valuedef getMin(self) -> int:return self.min_value if self.stack else -1

五、【题】用队列实现栈

使用一个队列即可
入栈时,

  1. 将新元素入队
  2. 将前面的元素全部重新进入队列

即可保证先进来的元素排在队列的前面

class MyStack {queue<int> myQueue;
public:/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {int n=myQueue.size();myQueue.push(x);for(int i=0;i<n;i++){myQueue.push(myQueue.front());myQueue.pop();}        }/** Removes the element on top of the stack and returns that element. */int pop() {int temp=myQueue.front();myQueue.pop();return temp;}/** Get the top element. */int top() {return myQueue.front();}/** Returns whether the stack is empty. */bool empty() {return myQueue.empty();}
};

使用两个队列反而将算法变得复杂,强行借助另一个队列来接收旧值

Leetcode刷题笔记12:【20】有效的括号【155】最小栈【255】用队列实现栈(STL:stackC++ 单引号和双引号)相关推荐

  1. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  2. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  3. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  4. LeetCode刷题记录12——232. Implement Queue using Stacks(easy)

    LeetCode刷题记录12--232. Implement Queue using Stacks(easy) 目录 LeetCode刷题记录12--232. Implement Queue usin ...

  5. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  6. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  7. 【leetcode刷题笔记】动态规划

    #[leetcode刷题笔记]动态规划 石子游戏 public boolean stoneGame(int[] piles) {int N = piles.length;// dp[i][j] is ...

  8. LeetCode刷题笔记-动态规划-day4

    文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...

  9. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

最新文章

  1. Linux运维人员必会开源运维工具体系
  2. C#之foreach语句
  3. ionic + cordova 配置和开发过程中的一些问题
  4. 服务器每秒钟执行命令数量是什么_全国自考互联网及其应用模拟试卷(一)及答案.doc...
  5. 小学生都能看懂的FFT!!!
  6. python install pip 区别_pip install和python -m pip install有什么区别?
  7. element-ui下拉框数据双向绑定
  8. hash算法总结收集
  9. java 001 002_java笔记0x002:操作符
  10. WebService原理
  11. establish connection
  12. hping3的编译和安装
  13. KeyError: ‘/home/xxx/anaconda3/lib/python3.8/site-packages/parso/python/grammar38.txt‘
  14. 转载:farey(法莱)数列
  15. 计算机专业特色展示,计算机专业实验室的特色建设
  16. 谷歌浏览器设置中文教程
  17. 四、SSL 虚拟私有网络
  18. 3.3.4 h5 -manifest.json-常用配置【uni-app从入门到精通在线教程(黄菊华-跨平台开发系列教程)】
  19. 如何利用大数据实现精准营销
  20. 《天池龙珠 - SQL训练营》03.SQL进阶:复杂查询方法-视图、子查询、函数等

热门文章

  1. thinkadmin按配置上传文件至本地,七牛云或阿里oss
  2. 在单点登录中,如果cookie被禁用了怎么办?
  3. 【图文并茂】六十多个 vscode 插件,助你打造最强编辑器
  4. salesforce架构_使用Salesforce扩展用户研究运营基础架构
  5. 寒假知识总结【日常吐槽】
  6. 元宇宙007 | 沉浸式家庭治疗,让治疗像演情景剧一样!
  7. 【Docker学习笔记 一】Docker基本概念及理论基础
  8. Task02:学习笔记文本预处理;语言模型;循环神经网络基础
  9. Web3.0技术栈简介
  10. java 统一日志_基于log4j实现统一日志管理