leetcode 栈 简单题(有效的括号)
1.给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
class Solution {
public boolean isValid(String s) {
Map<Character,Character> map=new HashMap<Character,Character>(){{
put('(',')');
put('{','}');
put('[',']');
}};
if(s.length()<=0||s.length()%2!=0){
return false;
}
Stack<Character> characterStack = new Stack<>();
for(char chars:s.toCharArray()){
if(map.containsKey(chars)){
characterStack.push(chars);
}else {
if(characterStack.isEmpty()||map.get(characterStack.peek())!=chars){
return false;
}else{
characterStack.pop();
}
}
}
if(characterStack.isEmpty()){
return true;
}
return false;
}
}
//自定义栈
public class Stack<T> {
private List<T> data;
public Stack(){
data=new ArrayList<T>();
}
//入栈
public void push(T x){
data.add(x);
}
public boolean isEmpty(){
return data.isEmpty();
}
//栈针
public T top(){
//list集合取数用get方法
return data.get(data.size()-1);
}
//弹出
public boolean pop(){
if(this.isEmpty()){
return false;
}
//移除元素
data.remove(data.size()-1);
return true;
}
public static void main(String[] args) {
isValid("){");
// Stack stack = new Stack();
// stack.push(1);
// stack.push(2);
// stack.push(3);
// stack.push(4);
//
// for(int i=0;i<4;i++){
// if(!stack.isEmpty()){
// System.out.println("栈帧位置"+stack.top());
// }
// stack.pop();
// int j=0;
// j++;
// System.out.println("弹出"+j);
// }
//1.如果传入字符串符合map的key就录入
//2.如果传入字符串不符合map的key,但是栈帧指向的值的value与传入的值相等就弹出
}
2.给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替
/**
* temperatures温度大于栈中元素时栈中元素出栈,小于栈中元素或者没有其他元素入栈
* @param temperatures
* @return
*/
public int[] dailyTemperatures(int[] temperatures) {
int[]count=new int[temperatures.length];
Stack<Integer> stack = new Stack<>();
for(int i=0;i<temperatures.length;i++){
//栈中元素出栈,栈外元素无论如何都要入栈一次,循环时多次操作
while (!stack.isEmpty()&&temperatures[i]>temperatures[stack.peek()]){
Integer peek = stack.peek();
stack.pop();
count[peek]=i-peek;
}
stack.push(i);
}
return count;
}