一个简单的实例:字符解压
程序例题:字符解压
输入第一行包含一个字符串s,代表压缩后的字符串。
S的长度<=1000;
S仅包含大写字母、[、]、|;
解压后的字符串长度不超过100000;
压缩递归层数不超过10层;
输入例子1:
HG[3|B[2|CA]]F
输出例子1:
HGBCACABCACABCACAF
可以看出当遇到’[’ ']'时就进行字符的解压
首先进行字符的输入
string input() //输入字符函数
{
string s;
cin >> s;
if (s.length() > 1000)
{
s.clear();
return 0;
}
return s;
}
之后对字符的查找判断是否存在‘[’,’]’;
string sp(string &s4) //查找完整的“[ ]”字符
{
int flag = 0;
for (int i = 0; i < s4.length(); i++)
{
if (s4[i] == '[') //按序查找'['字符,并记录次数
{
flag++;
}
else if (s4[i] == ']')//按序匹配到的']'字符
{
flag--;
if (flag == 0) //找到完整的一组‘[ ]’字符
{
s4 = Show(cp(s4.substr(0, i+1)))+s4.substr(i+1,s4.length()-i-1); //进行解压,并更新字符
}
}
}
if (flag != 0)
{
s4 = cp(s4);
}
return s4; //返回更新后的字符
}
然后对字符的拆解更新,递归解压
string cp(string &sss ) //去除"[ " "]"函数
{
for (unsigned int i = 0; i < sss.length(); )//按序判读是否为"[","]"字符
{
if (sss[i] == '[')
{
int n = sss.rfind(']', sss.length());
if (n != -1)
{
string temps = sss.substr(i + 1, n - (i + 1));//取出"[ ]"中的字符
sss=sss.substr(0,i)+Show(cp(temps));//解压最内层的"[ ]"中的字符
i = 0;
}
else
return sss; //出现不完整的"[ ]"则原型输出,不进行解压
}
else
i++; //没有找到"["字符
}
return sss; //返回字符串
}
string Show(string &show) //解压函数
{
string tempsf;
int n=show.find('|', 0); // 查找到"|"字符的位置
if (n != -1) //查找到
{
int num = show[n - 1]; //记录数字字符
for (int j = num - 48; j > 0; j--) //解压字符
{
tempsf += show.substr(n + 1, show.length() - (n + 1));
}
show = tempsf;
return show; //返回解压后的数据
}
else
return show; //没找到无需解压
}
最后对字符解压后更新输出
void Showe(string &s)//输出显示函数
{
cout << s;
}
在main()函数中进行试行
int main()
{
string s = input();
Showe(sp(s));
system("pause");
return 0;
}
程序就完成了
最后例子测试结果如下
以上程序还有一些需要完善和优化的地方,请多多指教。