题目
给定一个字符串,字符串包含数字、大小写字母以及括号(包括大括号、中括号和小括号),括号可以嵌套,即括号里面可以出现数字和括号。
按照如下的规则对字符串进行展开,不需要考虑括号成对不匹配问题,用例保证括号匹配,同时用例保证每个数字后面都有括号,不用考虑数字后面没有括号的这种情况,即2a2(b)这种情况不用考虑。
- 数字表示括号里的字符串重复的次数,展开后的字符串不包括括号。
- 将字符串进行逆序展开
输出最终展开的字符串。
解答
这题和用栈模拟数学运算很像,以下就是我的解答。
#include<iostream>
#include<stack>
#include<cctype>
#include<string>
#include<vector>
using namespace std;
int main() {
stack<char> st;
string s = "ed10{abc2[ij2(ibuog)m]n}";
for (int i = 0; i < s.size(); i++) {
if (s[i] != ')' && s[i] != '}' && s[i] != ']') {
st.push(s[i]);
}
else {
string s_temp = "";
while (st.top() != '(' && st.top() != '{' && st.top() != '[') {
s_temp += st.top();
st.pop();
}
st.pop();
int count = 0;
int place = 1;
while (!st.empty() && isdigit(st.top()))
{
count += place * (st.top() - 48);
place *= 10;
st.pop();
}
for (int i = 0; i < count; i++) {
for (int i = s_temp.size() - 1; i >= 0; i--) {
st.push(s_temp[i]);
}
}
}
}
while (!st.empty()) {
cout << st.top();
st.pop();
}
cin.get();
return 0;
}