Merge pull request #2194 from jinbudaily/master

更新 双指针总结、栈与队列篇章 排版格式修复
This commit is contained in:
程序员Carl
2023-07-20 15:31:00 +08:00
committed by GitHub
10 changed files with 162 additions and 130 deletions

View File

@ -39,12 +39,13 @@
* 输入: "{[]}"
* 输出: true
# 思路
## 算法公开课
《代码随想录》算法视频公开课:[栈的拿手好戏!| LeetCode20. 有效的括号](https://www.bilibili.com/video/BV1AF411w78g),相信结合视频看本篇题解,更有助于大家对链表的理解。
**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)[栈的拿手好戏!| LeetCode20. 有效的括号](https://www.bilibili.com/video/BV1AF411w78g),相信结合视频看本篇题解,更有助于大家对本题的理解**
## 思路
## 题外话
### 题外话
**括号匹配是使用栈解决的经典问题。**
@ -68,7 +69,7 @@ cd a/b/c/../../
这里我就不过多展开了,先来看题。
## 进入正题
### 进入正题
由于栈结构的特殊性,非常适合做对称匹配类的题目。
@ -143,8 +144,8 @@ public:
## 其他语言版本
### Java
Java
```Java
class Solution {
public boolean isValid(String s) {
@ -171,7 +172,8 @@ class Solution {
}
```
Python
### Python
```python
# 方法一,仅使用栈,更省空间
class Solution:
@ -213,7 +215,8 @@ class Solution:
return True if not stack else False
```
Go
### Go
```Go
func isValid(s string) bool {
hash := map[byte]byte{')':'(', ']':'[', '}':'{'}
@ -235,7 +238,8 @@ func isValid(s string) bool {
}
```
Ruby:
### Ruby:
```ruby
def is_valid(strs)
symbol_map = {')' => '(', '}' => '{', ']' => '['}
@ -253,7 +257,8 @@ def is_valid(strs)
end
```
Javascript:
### Javascript:
```javascript
var isValid = function (s) {
const stack = [];
@ -296,7 +301,7 @@ var isValid = function(s) {
};
```
TypeScript:
### TypeScript:
版本一:普通版
@ -348,7 +353,7 @@ function isValid(s: string): boolean {
};
```
Swift
### Swift:
```swift
func isValid(_ s: String) -> Bool {
@ -373,7 +378,8 @@ func isValid(_ s: String) -> Bool {
}
```
C:
### C:
```C
//辅助函数判断栈顶元素与输入的括号是否为一对。若不是则返回False
int notMatch(char par, char* stack, int stackTop) {
@ -414,8 +420,8 @@ bool isValid(char * s){
}
```
### C#:
C#:
```csharp
public class Solution {
public bool IsValid(string s) {
@ -447,7 +453,8 @@ public class Solution {
}
```
PHP:
### PHP:
```php
// https://www.php.net/manual/zh/class.splstack.php
class Solution
@ -475,8 +482,8 @@ class Solution
}
```
### Scala:
Scala:
```scala
object Solution {
import scala.collection.mutable
@ -499,7 +506,7 @@ object Solution {
}
```
rust:
### Rust:
```rust
impl Solution {

View File

@ -5,8 +5,6 @@
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
> 这不仅仅是一道好题,也展现出计算机的思考方式
# 150. 逆波兰表达式求值
@ -63,9 +61,13 @@
* 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
# 思路
## 算法公开课
《代码随想录》算法视频公开课:[栈的最后表演! | LeetCode150. 逆波兰表达式求值](https://www.bilibili.com/video/BV1kd4y1o7on),相信结合视频再看本篇题解,更有助于大家对本题的理解。
**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)[栈的最后表演! | LeetCode150. 逆波兰表达式求值](https://www.bilibili.com/video/BV1kd4y1o7on),相信结合视频再看本篇题解,更有助于大家对本题的理解**
## 思路
### 正题
在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。
@ -117,7 +119,7 @@ public:
* 空间复杂度: O(n)
## 题外话
### 题外话
我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。
@ -134,11 +136,9 @@ public:
> During the 1970s and 1980s, Hewlett-Packard used RPN in all of their desktop and hand-held calculators, and continued to use it in some models into the 2020s.
## 其他语言版本
java:
### Java:
```Java
class Solution {
@ -164,7 +164,7 @@ class Solution {
}
```
python3
### Python3
```python
from operator import add, sub, mul
@ -201,7 +201,8 @@ class Solution:
```
Go:
### Go:
```Go
func evalRPN(tokens []string) int {
stack := []int{}
@ -228,7 +229,7 @@ func evalRPN(tokens []string) int {
}
```
javaScript:
### JavaScript:
```js
var evalRPN = function (tokens) {
@ -259,7 +260,7 @@ var evalRPN = function (tokens) {
};
```
TypeScript
### TypeScript
普通版:
@ -324,7 +325,8 @@ function evalRPN(tokens: string[]): number {
};
```
Swift
### Swift
```Swift
func evalRPN(_ tokens: [String]) -> Int {
var stack = [Int]()
@ -357,7 +359,8 @@ func evalRPN(_ tokens: [String]) -> Int {
}
```
C#:
### C#:
```csharp
public int EvalRPN(string[] tokens) {
int num;
@ -391,8 +394,8 @@ public int EvalRPN(string[] tokens) {
}
```
### PHP
PHP
```php
class Solution {
function evalRPN($tokens) {
@ -417,7 +420,8 @@ class Solution {
}
```
Scala:
### Scala:
```scala
object Solution {
import scala.collection.mutable
@ -447,7 +451,7 @@ object Solution {
}
```
rust:
### Rust:
```rust
impl Solution {

View File

@ -25,11 +25,11 @@
* 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque双端队列来模拟一个队列 , 只要是标准的队列操作即可。
* 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
## 算法公开课
# 思路
**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)[队列的基本操作! | LeetCode225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频再看本篇题解,更有助于大家对本题的理解**。
《代码随想录》算法公开课:[队列的基本操作! | LeetCode225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频再看本篇题解,更有助于大家对链表的理解。
## 思路
(这里要强调是单向队列)
@ -114,7 +114,7 @@ public:
* 时间复杂度: push为O(n)其他为O(1)
* 空间复杂度: O(n)
# 优化
## 优化
其实这道题目就是用一个队列就够了。
@ -162,9 +162,9 @@ public:
* 空间复杂度: O(n)
# 其他语言版本
## 其他语言版本
Java
### Java
使用两个 Queue 实现方法1
```java
@ -404,7 +404,7 @@ class MyStack {
}
```
Python
### Python
```python
from collections import deque
@ -496,8 +496,7 @@ class MyStack:
return not self.que
```
Go
### Go
使用两个队列实现
```go
@ -628,9 +627,7 @@ func (this *MyStack) Empty() bool {
*/
```
javaScript:
### JavaScript:
使用数组push, shift模拟队列
@ -740,7 +737,7 @@ MyStack.prototype.empty = function() {
```
TypeScript:
### TypeScript:
版本一:使用两个队列模拟栈
@ -812,7 +809,7 @@ class MyStack {
}
```
Swift
### Swift:
```Swift
// 定义一个队列数据结构
@ -931,8 +928,9 @@ class MyStack {
}
}
```
Scala:
### Scala:
使用两个队列模拟栈:
```scala
import scala.collection.mutable
@ -1015,8 +1013,8 @@ class MyStack() {
}
```
### C#:
C#:
```csharp
public class MyStack {
Queue<int> queue1;
@ -1051,8 +1049,9 @@ public class MyStack {
}
```
PHP
> 双对列
### PHP:
> 双队列
```php
// SplQueue 类通过使用一个双向链表来提供队列的主要功能。(PHP 5 >= 5.3.0, PHP 7, PHP 8)
// https://www.php.net/manual/zh/class.splqueue.php
@ -1130,6 +1129,8 @@ class MyStack {
}
```
### Rust:
> rust单队列
```rust

View File

@ -36,11 +36,12 @@ queue.empty(); // 返回 false
* 你所使用的语言也许不支持栈。你可以使用 list 或者 deque双端队列来模拟一个栈只要是标准的栈操作即可。
* 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
## 算法公开课
**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)[栈的基本操作! | LeetCode232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频再看本篇题解,更有助于大家对本题的理解**。
## 思路
《代码随想录》算法公开课:[栈的基本操作! | LeetCode232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频再看本篇题解,更有助于大家对栈和队列的理解。
这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。
使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈**一个输入栈,一个输出栈**,这里要注意输入栈和输出栈的关系。
@ -132,7 +133,7 @@ public:
## 其他语言版本
Java
### Java
```java
class MyQueue {
@ -179,8 +180,8 @@ class MyQueue {
```
### Python
Python
```python
class MyQueue:
@ -231,8 +232,8 @@ class MyQueue:
```
### Go
Go
```Go
type MyQueue struct {
stackIn []int //输入栈
@ -283,7 +284,7 @@ func (this *MyQueue) Empty() bool {
}
```
javaScript:
### JavaScript:
```js
// 使用两个数组的栈方法push, pop 实现队列
@ -338,7 +339,7 @@ MyQueue.prototype.empty = function() {
};
```
TypeScript:
### TypeScript:
```typescript
class MyQueue {
@ -374,7 +375,7 @@ class MyQueue {
}
```
Swift
### Swift
```swift
class MyQueue {
@ -413,7 +414,8 @@ class MyQueue {
}
```
C:
### C:
```C
/*
1.两个type为int的数组大小为100
@ -490,8 +492,8 @@ void myQueueFree(MyQueue* obj) {
}
```
### C#:
C#:
```csharp
public class MyQueue {
Stack<int> inStack;
@ -534,7 +536,8 @@ public class MyQueue {
PHP:
### PHP:
```php
// SplStack 类通过使用一个双向链表来提供栈的主要功能。[PHP 5 >= 5.3.0, PHP 7, PHP 8]
// https://www.php.net/manual/zh/class.splstack.php
@ -579,7 +582,8 @@ class MyQueue {
}
```
Scala:
### Scala:
```scala
class MyQueue() {
import scala.collection.mutable
@ -621,7 +625,7 @@ class MyQueue() {
}
```
rust:
### Rust:
```rust
struct MyQueue {
@ -666,4 +670,3 @@ impl MyQueue {
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>

View File

@ -28,11 +28,11 @@
* -10^4 <= nums[i] <= 10^4
* 1 <= k <= nums.length
## 算法公开课
**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)[单调队列正式登场!| LeetCode239. 滑动窗口最大值](https://www.bilibili.com/video/BV1XS4y1p7qj),相信结合视频再看本篇题解,更有助于大家对本题的理解**。
# 思路
《代码随想录》算法视频公开课:[单调队列正式登场!| LeetCode239. 滑动窗口最大值](https://www.bilibili.com/video/BV1XS4y1p7qj),相信结合视频在看本篇题解,更有助于大家对本题的理解。
## 思路
这是使用单调队列的经典题目。
@ -196,7 +196,7 @@ public:
空间复杂度因为我们定义一个辅助队列所以是O(k)。
# 扩展
## 扩展
大家貌似对单调队列 都有一些疑惑首先要明确的是题解中单调队列里的pop和push接口仅适用于本题哈。单调队列不是一成不变的而是不同场景不同写法总之要保证队列里单调递减或递增的原则所以叫做单调队列。 不要以为本题中的单调队列实现就是固定的写法哈。
@ -204,10 +204,10 @@ public:
# 其他语言版本
## 其他语言版本
### Java
Java
```Java
//解法一
//自定义数组
@ -298,7 +298,8 @@ class Solution {
}
```
Python
### Python
```python
from collections import deque
@ -338,8 +339,7 @@ class Solution:
return result
```
Go
### Go
```go
// 封装单调队列的方式解题
@ -401,7 +401,8 @@ func maxSlidingWindow(nums []int, k int) []int {
}
```
Javascript:
### Javascript:
```javascript
/**
* @param {number[]} nums
@ -449,7 +450,7 @@ var maxSlidingWindow = function (nums, k) {
};
```
TypeScript
### TypeScript
```typescript
function maxSlidingWindow(nums: number[], k: number): number[] {
@ -497,7 +498,9 @@ function maxSlidingWindow(nums: number[], k: number): number[] {
};
```
Swift:
### Swift:
解法一:
```Swift
/// 双向链表
@ -638,7 +641,8 @@ func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] {
return result
}
```
Scala:
### Scala:
```scala
import scala.collection.mutable.ArrayBuffer
object Solution {
@ -686,8 +690,8 @@ class MyQueue {
}
```
### PHP:
PHP:
```php
class Solution {
/**
@ -764,7 +768,8 @@ class MyQueue{
}
```
C#:
### C#:
```csharp
class myDequeue{
private LinkedList<int> linkedList = new LinkedList<int>();
@ -805,7 +810,7 @@ class myDequeue{
}
```
rust:
### Rust:
```rust
impl Solution {

View File

@ -5,8 +5,6 @@
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
> 前K个大数问题老生常谈不得不谈
# 347.前 K 个高频元素
@ -29,9 +27,11 @@
* 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。
* 你可以按任意顺序返回答案。
# 思路
## 算法公开课
《代码随想录》算法视频公开课:[优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode347.前 K 个高频元素](https://www.bilibili.com/video/BV1Xg41167Lz),相信结合视频看本篇题解,更有助于大家对本题的理解。
**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)[优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode347.前 K 个高频元素](https://www.bilibili.com/video/BV1Xg41167Lz),相信结合视频看本篇题解,更有助于大家对本题的理解**
## 思路
这道题目主要涉及到如下三块内容:
1. 要统计元素出现频率
@ -122,7 +122,7 @@ public:
* 时间复杂度: O(nlogk)
* 空间复杂度: O(n)
# 拓展
## 拓展
大家对这个比较运算在建堆时是如何应用的,为什么左大于右就会建立小顶堆,反而建立大顶堆比较困惑。
确实 例如我们在写快排的cmp函数的时候`return left>right` 就是从大到小,`return left<right` 就是从小到大。
@ -130,10 +130,10 @@ public:
优先级队列的定义正好反过来了,可能和优先级队列的源码实现有关(我没有仔细研究),我估计是底层实现上优先队列队首指向后面,队尾指向最前面的缘故!
# 其他语言版本
## 其他语言版本
### Java
Java
```java
/*Comparator接口说明:
@ -216,7 +216,8 @@ class Solution {
}
```
Python
### Python
```python
#时间复杂度O(nlogk)
#空间复杂度O(n)
@ -245,7 +246,7 @@ class Solution:
return result
```
Go
### Go
```go
//方法一:小顶堆
@ -320,8 +321,8 @@ func topKFrequent(nums []int, k int) []int {
### JavaScript:
JavaScript:
```js
// js 没有堆 需要自己构造
class Heap {
@ -419,7 +420,7 @@ const topKFrequent = function (nums, k) {
};
```
TypeScript
### TypeScript
```typescript
function topKFrequent(nums: number[], k: number): number[] {
@ -435,7 +436,8 @@ function topKFrequent(nums: number[], k: number): number[] {
};
```
C#:
### C#:
```csharp
public int[] TopKFrequent(int[] nums, int k) {
//哈希表-标权重
@ -473,7 +475,7 @@ C#:
```
Scala:
### Scala:
解法一: 优先级队列
```scala
@ -517,7 +519,9 @@ object Solution {
}
```
rust: 小根堆
### Rust
小根堆
```rust
use std::cmp::Reverse;
@ -549,3 +553,4 @@ impl Solution {
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>

View File

@ -5,8 +5,6 @@
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
> 匹配问题都是栈的强项
# 1047. 删除字符串中的所有相邻重复项
@ -30,11 +28,13 @@
* 1 <= S.length <= 20000
* S 仅由小写英文字母组成。
# 思路
## 算法公开课
《代码随想录》算法视频公开课:[栈的好戏还要继续!| LeetCode1047. 删除字符串中的所有相邻重复项](https://www.bilibili.com/video/BV12a411P7mw),相信结合视频看本篇题解,更有助于大家对本题的理解。
**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html)[栈的好戏还要继续!| LeetCode1047. 删除字符串中的所有相邻重复项](https://www.bilibili.com/video/BV12a411P7mw),相信结合视频看本篇题解,更有助于大家对本题的理解**
## 正题
## 思路
### 正题
本题要删除相邻相同元素,相对于[20. 有效的括号](https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html)来说其实也是匹配问题20. 有效的括号 是匹配左右括号,本题是匹配相邻元素,最后都是做消除的操作。
@ -105,7 +105,7 @@ public:
* 时间复杂度: O(n)
* 空间复杂度: O(1),返回值不计空间复杂度
## 题外话
### 题外话
这道题目就像是我们玩过的游戏对对碰,如果相同的元素挨在一起就要消除。
@ -125,8 +125,7 @@ public:
## 其他语言版本
Java
### Java
使用 Deque 作为堆栈
```Java
@ -203,7 +202,8 @@ class Solution {
}
```
Python
### Python
```python
# 方法一,使用栈
class Solution:
@ -239,7 +239,7 @@ class Solution:
return ''.join(res[0: slow])
```
Go
### Go
```go
func removeDuplicates(s string) string {
@ -258,7 +258,7 @@ func removeDuplicates(s string) string {
}
```
javaScript:
### JavaScript:
法一:使用栈
@ -295,7 +295,7 @@ var removeDuplicates = function(s) {
};
```
TypeScript
### TypeScript
```typescript
function removeDuplicates(s: string): string {
@ -318,7 +318,7 @@ function removeDuplicates(s: string): string {
};
```
C:
### C:
方法一:使用栈
```c
@ -371,7 +371,8 @@ char * removeDuplicates(char * s){
}
```
Swift
### Swift
```swift
func removeDuplicates(_ s: String) -> String {
var stack = [Character]()
@ -386,8 +387,8 @@ func removeDuplicates(_ s: String) -> String {
}
```
### C#:
C#:
```csharp
public string RemoveDuplicates(string s) {
//拿字符串直接作为栈,省去了栈还要转为字符串的操作
@ -405,8 +406,8 @@ public string RemoveDuplicates(string s) {
}
```
### PHP:
PHP:
```php
class Solution {
function removeDuplicates($s) {
@ -431,8 +432,8 @@ class Solution {
}
```
### Scala:
Scala:
```scala
object Solution {
import scala.collection.mutable
@ -455,7 +456,7 @@ object Solution {
}
```
rust:
### Rust:
```rust
impl Solution {

View File

@ -8,7 +8,8 @@
相信大家已经对双指针法很熟悉了,但是双指针法并不隶属于某一种数据结构,我们在讲解数组,链表,字符串都用到了双指针法,所有有必要针对双指针法做一个总结。
# 数组篇
# 双指针总结篇
## 数组篇
在[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。
@ -26,7 +27,7 @@ for (int i = 0; i < array.size(); i++) {
所以此时使用双指针法才展现出效率的优势:**通过两个指针在一个for循环下完成两个for循环的工作。**
# 字符串篇
## 字符串篇
在[字符串:这道题目,使用库函数一行代码搞定](https://programmercarl.com/0344.反转字符串.html)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。
@ -48,7 +49,7 @@ for (int i = 0; i < array.size(); i++) {
**主要还是大家用erase用的比较随意一定要注意for循环下用erase的情况一般可以用双指针写效率更高**
# 链表篇
## 链表篇
翻转链表是现场面试,白纸写代码的好题,考察了候选者对链表以及指针的熟悉程度,而且代码也不长,适合在白纸上写。
@ -62,7 +63,7 @@ for (int i = 0; i < array.size(); i++) {
那么找到环的入口,其实需要点简单的数学推理,我在文章中把找环的入口清清楚楚的推理的一遍,如果对找环入口不够清楚的同学建议自己看一看[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)。
# N数之和篇
## N数之和篇
在[哈希表:解决了两数之和,那么能解决三数之和么?](https://programmercarl.com/0015.三数之和.html)中讲到使用哈希法可以解决1.两数之和的问题
@ -87,7 +88,7 @@ for (int i = 0; i < array.size(); i++) {
同样的道理五数之和n数之和都是在这个基础上累加。
# 总结
## 总结
本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目除了链表一些题目一定要使用双指针其他题目都是使用双指针来提高效率一般是将O(n^2)的时间复杂度,降为$O(n)$。

View File

@ -3,9 +3,9 @@
<img src="../pics/训练营.png" width="1000"/>
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
# 栈与队列总结篇
# 栈与队列的理论基础
## 栈与队列的理论基础
首先我们在[栈与队列:来看看栈和队列不为人知的一面](https://programmercarl.com/栈与队列理论基础.html)中讲解了栈和队列的理论基础。
@ -37,9 +37,9 @@
**一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。**
# 栈经典题目
## 栈经典题目
## 栈在系统中的应用
### 栈在系统中的应用
如果还记得编译原理的话,编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,就是使用了栈这种数据结构。
@ -59,7 +59,7 @@ cd a/b/c/../../
**所以数据结构与算法的应用往往隐藏在我们看不到的地方!**
## 括号匹配问题
### 括号匹配问题
在[栈与队列:系统中处处都是栈的应用](https://programmercarl.com/0020.有效的括号.html)中我们讲解了括号匹配问题。
@ -75,23 +75,23 @@ cd a/b/c/../../
这里还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!
## 字符串去重问题
### 字符串去重问题
在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中讲解了字符串去重问题。
1047. 删除字符串中的所有相邻重复项
思路就是可以把字符串顺序放到一个栈中,然后如果相同的话 栈就弹出,这样最后栈里剩下的元素都是相邻不相同的元素了。
## 逆波兰表达式问题
### 逆波兰表达式问题
在[栈与队列:有没有想过计算机是如何处理表达式的?](https://programmercarl.com/0150.逆波兰表达式求值.html)中讲解了求逆波兰表达式。
本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。**
# 队列的经典题目
## 队列的经典题目
## 滑动窗口最大值问题
### 滑动窗口最大值问题
在[栈与队列:滑动窗口里求最大值引出一个重要数据结构](https://programmercarl.com/0239.滑动窗口最大值.html)中讲解了一种数据结构:单调队列。
@ -119,7 +119,7 @@ cd a/b/c/../../
我们用deque作为单调队列的底层数据结构C++中deque是stack和queue默认的底层实现容器这个我们之前已经讲过deque是可以两边扩展的而且deque里元素并不是严格的连续分布的。
## 求前 K 个高频元素
### 求前 K 个高频元素
在[栈与队列:求前 K 个高频元素和队列有啥关系?](https://programmercarl.com/0347.前K个高频元素.html)中讲解了求前 K 个高频元素。
@ -143,7 +143,7 @@ cd a/b/c/../../
所以排序的过程的时间复杂度是$O(\log k)$,整个算法的时间复杂度是$O(n\log k)$。
# 总结
## 总结
在栈与队列系列中,我们强调栈与队列的基础,也是很多同学容易忽视的点。
@ -162,3 +162,4 @@ cd a/b/c/../../
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>

View File

@ -4,8 +4,11 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
> 来看看栈和队列不为人知的一面
# 栈与队列理论基础
我想栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出。
如图所示:
@ -93,3 +96,4 @@ std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>