leetcode 栈 简单题(有效的括号)

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;
    }

你可能感兴趣的:(leetcode,java,算法)