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