質問の幹:
比較的単純で、文字列に似ています。 、ABC[3LM][2[2HJ]]
解凍されますABCLMLMLMHJHJHJHJ
。つまり、元の文字列を与えて、解凍された文字列を取得します。
アイデア:
この質問は比較的単純な再帰であり、スタックを使用して実現します。文字が読み取られるたびに、その文字はスタックに置かれます。文字が見つかった場合]
、その文字はスタックから徐々に読み取られ、数値が読み取られるまで一時的な文字列を形成します。数値が抽出された後は、倍数に従って、数値の一時文字列を展開し、スタックに置きます。
コードは次のとおりです。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
char word, temp[20005];
cin>>s;
stack<char> res;
int size = s.size(), j, num, order;
for (int i = 0; i < size; ++i)
{
word = s[i];
if (word != ']')
res.push(word);
else // 如果获取到了 ]
{
j = -1;
// 从stack中把字符拿出来,放到temp中
word = res.top();;
res.pop();
while (word < '0' || word > '9') // 如果没拿到数字
{
temp[++j] = word;
word = res.top();
res.pop();
}
// 如果拿到了数字 开始提取数字
num = word - '0';
order = 10;
word = res.top();
res.pop();
while (word != '[')
{
num += (order * (word - '0'));
order *= 10;
word = res.top();
res.pop();
}
// 如果遇到了闭合符号 [
// num是重复次数 temp最后一个字母的index是j
for (int p = 0; p < num; ++p)
{
for (int y = j; y >=0; --y)
res.push(temp[y]);
}
}
}
j = -1;
while (!res.empty())
{
word = res.top();
res.pop();
temp[++j] = word;
}
for (int i = j; i >= 0; --i)
printf("%c", temp[i]);
return 0;
}
しかし、ここではこの状況には対処しませんでした。AS[2[VB3[HJ]]]
これは解凍後に発生しますASVBHJHJHJVBHJHJHJ
。私のコードはデフォルトでスタックから数値を取得し、その後それを取得します[
。つまり、この例ではこの状況は考慮されていませんVB
。しかし、同じことが通用する可能性があります。。。
再帰的方法:
他の人の解決策を直接見てください:
#include<bits/stdc++.h>
using namespace std;
string read()
{
int n;
string s="",s1;
char c;
while (cin>>c)//一直读入字符,直到Ctrl+z
{
if (c=='[')
{
cin>>n;//读入D
s1=read();//读入X
while (n--) s+=s1;//重复D次X
//注:上面不能写成while (n--) s+=read();
}
else
{
if (c==']') return s;//返回X
else s+=c;//如果不是'['和']',那就是X的一个字符,所以加进X
}
}
}
int main()//巨短主函数
{
cout<<read();
return 0;
}
関数が再帰的に呼び出されていることがわかりますread()
。
ちょっとした問題
再帰的なコードでは、文字列の場合、 325という数字を325SFFS
直接読み込むこともできるし、その文字から読み続けることもできるようです。int n; cin>>n;
S
テスト:
#include<bits/stdc++.h>
#include <sstream>
using namespace std;
int main()
{
string s("aa45sfjsljfls");
std::stringstream stream;
stream<<s;
char c;
stream>>c;
cout<<c<<endl;
stream>>c;
cout<<c<<endl;
int n;
stream>>n;
cout<<n<<endl;
stream>>c;
cout<<c<<endl;
return 0;
}
結果:
a
a
45
s