## 棧
特點:后進先出(LIFO)
出棧入棧都是O(1)內完成
可以用一個單鏈表來實現
## leet-code練手
### 20. 有效的括號
~~~
package com.mango.leet.code.simple;
/**
* 20. 有效的括號
*/
import java.util.Stack;
/**
* 給定一個只包括 '(',')','{','}','[',']'?的字符串 s ,判斷字符串是否有效。
*
* 有效字符串需滿足:
*
* 左括號必須用相同類型的右括號閉合。
* 左括號必須以正確的順序閉合。
* ?
*
* 示例 1:
*
* 輸入:s = "()"
* 輸出:true
* 示例?2:
*
* 輸入:s = "()[]{}"
* 輸出:true
* 示例?3:
*
* 輸入:s = "(]"
* 輸出:false
* 示例?4:
*
* 輸入:s = "([)]"
* 輸出:false
* 示例?5:
*
* 輸入:s = "{[]}"
* 輸出:true
* ?
*
* 提示:
*
* 1 <= s.length <= 104
* s 僅由括號 '()[]{}' 組成
*
* 來源:力扣(LeetCode)
* 鏈接:https://leetcode-cn.com/problems/valid-parentheses
* 著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
*/
public class LC20 {
public static void main(String[] args) {
System.out.println((int)'(');
System.out.println((int)')');
System.out.println((int)'{');
System.out.println((int)'}');
System.out.println((int)'[');
System.out.println((int)']');
System.out.println(new Solution().isValid("(){}}{"));
}
static class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack();
for(int i=0;i<s.length();i++){
if(stack.isEmpty()){
stack.push(s.charAt(i));
continue;
}
char c = s.charAt(i);
Character character = stack.pop();
if(character == ']' || character == '}' || character == ')'){
return false;
}
if((character == '[' && c == ']') ||
(character == '{' && c == '}') ||
(character == '(' && c == ')')){
// 括號匹配,并且左括號在前
}else{
stack.push(character);
stack.push(c);
}
}
return stack.isEmpty();
}
public boolean isValid2(String s) {
Stack<Character> stack = new Stack();
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(c == '['){
stack.push(']');
}else if(c == '{'){
stack.push('}');
}else if(c == '('){
stack.push(')');
}else if(!stack.isEmpty() && c != stack.peek()){
return false;
}else {
stack.pop();
}
}
return stack.isEmpty();
}
// 自己用數組加下標模擬棧,不用api
public boolean isValid3(String s) {
int l = s.length();
char []st = new char[l];
int top = -1;
for(int i = 0;i < l;i++){
char s_in = s.charAt(i);
if(s_in == '(' || s_in == '[' || s_in == '{'){
top++;
st[top] = s_in;
}
else{
if(top < 0){
return false;
}
if(s_in == ')' && st[top] != '('){
return false;
}
if(s_in == ']' && st[top] != '['){
return false;
}
if(s_in == '}' && st[top] != '{'){
return false;
}
top--;
}
}
if(top > -1){
return false;
}
return true;
}
}
}
/**
* 2022-03-02
* 思路:
* 利用棧先入后出的特點,如果括號匹配就出站,不匹配且做括號在前的就先入棧
*/
~~~
#### 739每日溫度
~~~
package com.mango.leet.code.middle;
/**
* 739. 每日溫度
*/
import java.util.Arrays;
import java.util.Stack;
/**
* 給定一個整數數組?temperatures?,表示每天的溫度,返回一個數組?answer?,其中?answer[i]?是指在第 i 天之后,才會有更高的溫度。如果氣溫在這之后都不會升高,請在該位置用?0 來代替。
*
* ?
*
* 示例 1:
*
* 輸入: temperatures = [73,74,75,71,69,72,76,73]
* 輸出:?[1,1,4,2,1,1,0,0]
* 示例 2:
*
* 輸入: temperatures = [30,40,50,60]
* 輸出:?[1,1,1,0]
* 示例 3:
*
* 輸入: temperatures = [30,60,90]
* 輸出: [1,1,0]
* ?
*
* 提示:
*
* 1 <=?temperatures.length <= 105
* 30 <=?temperatures[i]?<= 100
*
* 來源:力扣(LeetCode)
* 鏈接:https://leetcode-cn.com/problems/daily-temperatures
* 著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
*/
public class LC739 {
public static void main(String[] args) {
int[] arr = new int[]{89,62,70,58,47,47,46,76,100,70};
System.out.println(Arrays.toString(new Solution().dailyTemperatures(arr)));
}
static class Solution {
// [73,74,75,71,69,72,76,73]
public int[] dailyTemperatures(int[] temperatures) {
int[] result = new int[temperatures.length];
Stack<Integer> stack = new Stack<Integer>();
for(int i=0;i<temperatures.length;i++){
while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){
int index = stack.pop();
result[index] = i - index;
}
stack.push(i);
}
return result;
}
}
}
/**
* 2022-03-03
* 思路:
* 1. 將下標壓入棧里
* 2. 遍歷比較當前下標數據A和棧內下標數據B,如果A>B,則出棧并記錄站內下標的變暖天數,并將A下標壓入站內
* 3. 遍歷站內數據和當前下標數據做對比,重復步驟2
* 4. 如果棧空或者當前值小于站內下標對應值,則入棧
*/
~~~
- Redis來回摩擦
- redis的數據結構SDS和DICT
- redis的持久化和事件模型
- Java
- 從何而來之Java IO
- 發布Jar包到公共Maven倉庫
- Java本地方法調用
- 面試突擊
- Linux
- Nginx
- SpringBoot
- Springboot集成Actuator和SpringbootAdminServer監控
- SpringCloud
- Spring Cloud初識
- Spring Cloud的5大核心組件
- Spring Cloud的注冊中心
- Spring Cloud注冊中心之Eureka
- Spring Cloud注冊中心之Consul
- Spring Cloud注冊中心之Nacos
- Spring Cloud的負載均衡之Ribbon
- Spring Cloud的服務調用之Feign
- Spring Cloud的熔斷器
- Spring Cloud熔斷器之Hystrix
- Spring Cloud的熔斷器監控
- Spring Cloud的網關
- Spring Cloud的網關之Zuul
- Spring Cloud的配置中心
- Spring Cloud配置中心之Config Server
- Spring Cloud Config配置刷新
- Spring Cloud的鏈路跟蹤
- Spring Cloud的鏈路監控之Sleuth
- Spring Cloud的鏈路監控之Zipkin
- Spring Cloud集成Admin Server
- Docker
- docker日常基本使用
- docker-machine的基本使用
- Kubernetes
- kubernetes初識
- kubeadm安裝k8s集群
- minikube安裝k8s集群
- k8s的命令行管理工具
- k8s的web管理工具
- k8s的相關發行版
- k3s初識及安裝
- rancher的安裝及使用
- RaspberryPi
- 運維
- 域名證書更新
- 騰訊云主機組建內網
- IDEA插件開發
- 第一個IDEA插件hello ide開發
- 千呼萬喚始出來的IDEA筆記插件mdNote
- 大剛學算法
- 待整理
- 一些概念和知識點
- 位運算
- 數據結構
- 字符串和數組
- LC242-有效的字母異位詞
- 鏈表
- LC25-K個一組翻轉鏈表
- LC83-刪除有序單鏈表重復的元素
- 棧
- LC20-有效的括號
- 隊列
- 雙端隊列
- 優先隊列
- 樹
- 二叉樹
- 二叉樹的遍歷
- 二叉樹的遞歸序
- 二叉樹的前序遍歷(遞歸)
- 二叉樹的前序遍歷(非遞歸)
- 二叉樹的中序遍歷(遞歸)
- 二叉樹的中序遍歷(非遞歸)
- 二叉樹的后序遍歷(遞歸)
- 二叉樹的后序遍歷(非遞歸)
- 二叉樹的廣度優先遍歷(BFS)
- 平衡二叉樹
- 二叉搜索樹
- 滿二叉樹
- 完全二叉樹
- 二叉樹的打印(二維數組)
- 樹的序列化和反序列化
- 前綴樹
- 堆
- Java系統堆優先隊列
- 集合數組實現堆
- 圖
- 圖的定義
- 圖的存儲方式
- 圖的Java數據結構(鄰接表)
- 圖的表達方式及對應場景創建
- 圖的遍歷
- 圖的拓撲排序
- 圖的最小生成樹之Prim算法
- 圖的最小生成樹之Kruskal算法
- 圖的最小單元路徑之Dijkstra算法
- 位圖
- Java實現位圖
- 并查集
- Java實現并查集
- 滑動窗口
- 單調棧
- 排序
- 冒泡排序BubbleSort
- 選擇排序SelectSort
- 插入排序InsertSort
- 插入排序InsertXSort
- 歸并排序MergeSort
- 快速排序QuickSort
- 快速排序優化版QuickFastSort
- 堆排序HeapSort
- 哈希Hash
- 哈希函數
- guava中的hash函數
- hutool中的hash函數
- 哈希表實現
- Java之HashMap的實現
- Java之HashSet的實現
- 一致性哈希算法
- 經典問題
- 荷蘭國旗問題
- KMP算法
- Manacher算法
- Go