问题描述
字符串仅由字母数字,括号 ‘[’,’]’ 组成,数字只出现在括号前面,表示括号中的字符出现了几次。现在需要将数字和括号去掉,恢复字符串原来的状态。
输入样例:
e3[xyz]
3[ab2[xy]]
输出样例:
exyzxyzxyz
abxyxyabxyxyabxyxy
问题分析
用栈来解决,将原字符串的的每个字符依次压栈,如果碰见右括号 ‘]’,就将栈中数据取出,直到遇见左括号,再将左括号前面的数字取出,将两括号之间的字符叠加,再次压入栈中。直到遍历完原字符串中的字符。这时展开的字符已经在栈中了,将所有字符取出即可。
#include<iostream>
#include<string>
#include<stack>
using namespace std;
string expressionExpand(string &s)
{
if (s.empty())
return s;
string res;
stack<char> sk;
for (auto c : s)
{
if (c == ']') //碰见右括号,就将右括号与左括号之间的字符取出,并将左括号前的数字取出
{
string dup; //保存括号中的字符
while (sk.top() != '[')
{
dup = sk.top() + dup;
sk.pop();
}
sk.pop();
string num; //保存括号前的数字
while (!sk.empty() && isdigit(sk.top()))
{
num = sk.top() + num;
sk.pop();
}
int cnt = stoi(num.c_str());
string str;
while (cnt > 0) //根据数字值将括号中字符累加
{
str += dup;
--cnt;
}
for (auto c : str)
sk.push(c);
}
else
sk.push(c); //字符依次压栈
}
while (!sk.empty()) //将栈中展开的字符取出
{
res = sk.top() + res;
sk.pop();
}
return res;
}
int main()
{
string s;
while(cin >> s)
cout << expressionExpand(s) << endl;
return 0;
}