摘要
栈相关算法练习
一、算法练习题目
94. 二叉树的中序遍历
package 栈算法;
import java.util.*;
public class inorderTraversal94 {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> stk = new LinkedList<TreeNode>();
// 递归判断
while (root != null || !stk.isEmpty()) {
while (root != null) {
stk.push(root);
// 递归进左边
root = root.left;
}
//
root = stk.pop();
res.add(root.val);
root = root.right;
}
return res;
}
public List<Integer> inorderTraversal2(TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.add(root);
root = root.left;
}
root = stack.pop();
// 加入节点数值
list.add(root.val);
root = root.right;
}
return list;
}
}
20. 有效的括号
package 栈算法;
import org.junit.Test;
import java.util.HashMap;
import java.util.Stack;
public class isValid20 {
/**
* 是否有效
*
* @param s
* @return
*/
public boolean isValid(String s) {
HashMap<Character, Character> map = new HashMap<>();
map.put('}', '{');
map.put(')', '(');
map.put(']', '[');
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '{' || s.charAt(i) == '[' || s.charAt(i) == '(') {
stack.add(s.charAt(i));
}else {
if (!stack.isEmpty() && stack.peek() == map.get(s.charAt(i))) {
stack.pop();
} else {
return false;
}
}
}
return stack.isEmpty();
}
@Test
public void test() {
boolean valid = isValid("([)]");
System.out.println(valid);
}
}
155. 最小栈
package 栈算法;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;
public class MinStack155 {
/**
* 最小栈
*/
Stack<Integer> stack;
public MinStack155() {
stack=new Stack<Integer>();
}
public void push(int val) {
if (stack.isEmpty()) {
stack.add(val);
stack.add(val);
} else {
int value=stack.peek();
if (value>=val){
stack.add(val);
stack.add(val);
}else {
stack.add(val);
stack.add(value);
}
}
}
public void pop() {
stack.pop();
stack.pop();
}
public int top() {
int n1=stack.pop();
int n2=stack.pop();
stack.add(n2);
stack.add(n1);
return n2;
}
public int getMin() {
int tmp=stack.peek();
return tmp;
}
}
234. 回文链表
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
public class test {
public class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
/**
* 判断是否为回文链表 将数据拷贝到数组和list中 在采用的双指针的方式来判断的
*
*
*
* @param head
* @return
*/
public boolean isPalindrome(ListNode head) {
List<Integer> list = new ArrayList<>();
while (head != null) {
list.add(head.val);
head = head.next;
}
int [] arr=new int[list.size()];
for (int i=0;i<arr.length;i++){
arr[i]=list.get(i);
}
int start = 0;
int end = list.size() - 1;
while (start <= end) {
if (arr[start] != arr[end]) {
return false;
}
start++;
end--;
}
return true;
}
}
739. 每日温度
package 栈算法;
import org.junit.Test;
import java.util.Deque;
import java.util.LinkedList;
public class dailyTemperatures739V2 {
/**
* 构造的单调递增数组
*
* @param temperatures
* @return
*/
public int[] dailyTemperatures(int[] temperatures) {
int[] ans = new int[temperatures.length];
Deque<Integer> stack = new LinkedList<Integer>();
// stack 存储的是的数组的下标的位置
for (int i = 0; i < temperatures.length; i++) {
int temperature = temperatures[i];
while (!stack.isEmpty() && temperature > temperatures[stack.peek()]) {
int prevIndex = stack.pop();
ans[prevIndex] = i - prevIndex;
}
stack.push(i);
}
return ans;
}
@Test
public void test() {
int[] ints = dailyTemperatures(new int[]{73, 74, 75, 71, 69, 72, 76, 73});
}
}
581. 最短无序连续子数组
394. 字符串解码
114. 二叉树展开为链表
32. 最长有效括号
42. 接雨水
84. 柱状图中最大的矩形
85. 最大矩形