class Solution {
public:
    string decodeString(string s) {
        //定义两个栈
        //栈1用于括号的匹配
        //栈2用于辅助反转字符串
        stack<char>stack1;
        stack<char>stack2;
        int n=s.length();
        //ans和t都是用来辅助存过程中的字符串,answer用来存最后的答案字符串
        string ans;
        string t,answer="";
        //flag用来标记区分"abc"这种特殊的情况进行特殊的处理,即最后直接输出原串
        bool flag=0;
        //遍历原串
        for(int i=0;i<n;i++){
            //由于栈2是用来辅助反转每次得到的字符串的,所以在进行获取下一个字符串前,必须讲原先在栈2内进行反转的字符串输出,存入answer中
            //即清空栈2,以便进行下一次的反转
           while(!stack2.empty()){
            answer+=stack2.top();
            stack2.pop();
           }
           //只要不为右括号,就将元素入栈1
            if(s[i]!=']'){
                stack1.push(s[i]);
            }else{
                //如果是右括号,就将字符弹出,并重复k遍进行解密
                flag=1;
                ans="";
                while(stack1.top()!='['){
                    ans+=stack1.top();
                    stack1.pop();
                }
                t="";
                stack1.pop();
                //重复k遍进行解密
                for(int i=1;i<=stack1.top()-'0';i++){
                    t+=ans;
                }
                stack1.pop();
                //判断一下,如果栈1不为空,说明还要将刚刚解密出来的字符串压入栈1中,进行下一次的解密
                if(!stack1.empty()){
                    for(int i=t.length()-1;i>=0;i--){
                    stack1.push(t[i]);
                   }
                   //否则,就将压入栈2中进行反转
                }else {
                    for(int i=0;i<t.length();i++){
                    stack2.push(t[i]);
                   }
                }
                
            }
        }
        //最后判断一下如果输入的字符串是“abc”这种,就直接返回原串
       if(flag==0)  return s;
       //否则就将栈2中还没有加入answer的加入到answer中
       else if(!stack2.empty()){
        while(!stack2.empty()){
            answer+=stack2.top();
            stack2.pop();
           }
       } 
       string b="";
       //由于例如3[1]2[2]ef的串,最后的ef在压入栈1之后,由于没有对应的右括号能让它们从栈1中出来,所以要手动将其弹出来,加入answer中 
       while(!stack1.empty()){
           b+=stack1.top();
           stack1.pop();
       } 
       reverse(b.begin(),b.end());
       return answer+b;
    }
};