import java.util.*;


public class Solution {
    public boolean isValidString (String s) {
        //创建两个linkedList(是基于双向链表实现的),new LinkedList<>();
        //ArrayList是基于数组实现的,动态分配内存
        LinkedList<Integer> left=new LinkedList<>();
        LinkedList<Integer> star=new LinkedList<>(); 
        int n=s.length();
        //设置两个栈,left和star
        //遍历字符串,用字符串s名.charAt(i),定位到字符串s的第i位,获得字符串s第i位的字符
        for(int i=0;i<n;i++){
            char c=s.charAt(i);
            //如果是左括号和星号就入栈
            if(c=='('){
                left.push(i);
            }else if(c=='*'){
                star.push(i);
            }else{
                //如果是右括号,就先将它与左括号进行匹配,如果没有左括号再与星号匹配(此时星号作为左括号),这样如果能找到与所有的右括号进行匹配,就表示右括号匹配成功
                if(!left.isEmpty()){
                    left.pop();
                }else if(!star.isEmpty()){
                    star.pop();
                }else{
                    return false;
                }
            }
        }
        //再将剩下的左括号和星号进行匹配,此时星号作为右括号或就是空格
        //只要两个栈不为空,就将栈顶元素弹出,由于左括号对应的ACSII比*对应的ACSII小,所以如果top1>top2,就表明匹配不成功
        while(!left.isEmpty()&&!star.isEmpty()){
            int top1=left.pop();
            int top2=star.pop();
            if(top1>top2){
                return false;
            }
          
        }
        //最后只需要去判断一下左括号栈是否为空,如果左括号栈为空,就表明所有的左括号都匹配成功,就算有剩下的*也没事,因为这些剩下的*就是作为空格
            return left.isEmpty();
    }
}