问题描述

字符串仅由字母数字,括号 ‘[’,’]’ 组成,数字只出现在括号前面,表示括号中的字符出现了几次。现在需要将数字和括号去掉,恢复字符串原来的状态。
输入样例
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;
}