解码字符串(C++)
时间限制:C/C++语言1000MS;其他语言3000MS
内存限制:C/C++语言65536KB;其他语言589824KB
题目描述:
给出一个表达式S,该表达式只包括数字、字母及方括号这三种元素。该表达式具有如下规则:数字只会出现在方括号前,它表示方括号内容的重复次数,方括号中的内容可以是普通的字海串,也可以另一个表达式。请写一段程序,按照上述规则格输入的表达式层开成目标字符串。
输入:
输入包含多组测试数据,每组数据为一行,每行数据是一个合法的高达式s,你不需要对该验入的合法性进行判断。
输出
输出按照上述规则展开的字符串。
样例输入
e3[2[abc]gh]
e9[xyz]
官输出
eabcabcghabcabcghabcabcgh
exyzxyzxyzxyzxyzxyzxyzxyzxyz
解题思路:
使用栈进栈出
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <stack> 5 using namespace std; 6 7 int main() 8 { 9 vector<string>Ans; 10 for (int n = 0; n < 2; ++n)//输入数据组数 11 { 12 stack<char>res; 13 string str; 14 cin >> str;//输入测试数组 15 for (int i = 0; i < str.size(); ++i) 16 { 17 if (str[i] == ']')//栈出 18 { 19 string tempstr = ""; 20 while (res.top() != '[') 21 { 22 tempstr += res.top();//获取循环字符串 23 res.pop(); 24 } 25 res.pop();//弹出‘[’ 26 int i = 1, num = 0; 27 while (res.top() >= '0'&&res.top() <= '9')//防止是两位数字 28 { 29 num += num + (res.top()-'0')*i; 30 i = 10 * i; 31 res.pop(); 32 } 33 while (num--) 34 { 35 for (int j = tempstr.size() - 1; j >= 0; --j)//循环再次入栈 36 res.push(tempstr[j]); 37 } 38 tempstr = "";//清空临时字符 39 } 40 41 else 42 res.push(str[i]);//入栈 43 } 44 string restr; 45 restr.resize(res.size()); 46 int i = res.size(); 47 while (i--) 48 { 49 restr[i] = res.top();//反向出栈存储 50 res.pop(); 51 } 52 Ans.push_back(restr); 53 } 54 //输出 55 for (auto a : Ans) 56 cout << a << endl; 57 58 system("pause"); 59 return 0; 60 }