/*
如果当前的字符为数位,解析出一个数字(连续的多个数位)并进栈
如果当前的字符为字母或者左括号,直接进栈
如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接成一个字符串,此时取出栈顶的数字(此时栈顶一定是数字,想想为什么?),就是这个字符串应该出现的次数,我们根据这个次数和字符串构造出新的字符串并进栈
*/
#define MAX_SIZE 10000
void GetString(char *str, char *Stack_letter, int *top_letter){
//从Stack_letter中拿出字符串(反向)
int i=0;
while(Stack_letter[(*top_letter)-1] != '['){
str[i]=Stack_letter[(*top_letter)-1];
(*top_letter)--;
i++;
}
str[i]='\0';
(*top_letter) -= 1; //‘['出栈
}
void PutStr(char *str, int temp_num, char *Stack_letter, int *top_letter){
//将temp_num个str放回Stack_letter中
int n = (int )strlen(str);
for(int j=1;j<=temp_num;j++){
for(int i=n-1;i>=0;i--){
Stack_letter[(*top_letter)]=str[i];
(*top_letter) ++ ;
//printf("%d %c\n",(*top_letter),str[i]);
}
}
}
char * decodeString(char * s){
int len = (int) strlen (s);
int num=0;
char * Stack_letter =(char *) malloc(sizeof(char)*MAX_SIZE);
int top_letter=0;
int * Stack_num = (int *) malloc(sizeof(int)*MAX_SIZE);
int top_num=0;
for(int i=0;i<len;i++){
if(s[i]>='0' && s[i]<='9'){
num = num*10 + (s[i]-'0');
}
else if (s[i]=='['){
Stack_num[top_num]=num;
top_num ++;
num=0;
Stack_letter[top_letter]=s[i];
top_letter ++;
}
else if (s[i]>='a' && s[i]<='z'){
Stack_letter[top_letter]=s[i];
top_letter ++;
}
else{
char str[len];
GetString(str, Stack_letter, &top_letter);
//printf("%s\n",str);
int temp_num = Stack_num[top_num-1];
top_num--;
//printf("%d\n",temp_num);
//printf("top_letter:%d\n",top_letter);
PutStr(str, temp_num, Stack_letter, &top_letter);
}
}
Stack_letter[top_letter]='\0';
return Stack_letter;
}
int main() {
char str[100];
scanf("%s",str);
char *p = decodeString(str);
printf("%s\n",p);
free(p);
return 0;
}
394. 字符串解码
最新推荐文章于 2024-05-19 22:53:12 发布