主题思想: 主要是利用两个栈,一个存放数字,一个存放字符串,。存放数字的栈需要把(
也放进去,用于分割需要合并的字符串。
比如 1a2b1(ab) 如果仅仅是把数字存进数字栈中, 遇到一个字符串需要数字栈出栈顶元素,进行扩展字符串,比如,1a,读到a时,需要把1出栈,如果不存放(
, 读到1(ab) 时,读到a时就把1出栈了,正确是读到b)时,ab作为一个整体扩展。
另外还需要考虑,输入中省略 1的 比如直接输入ab ,或(ab)
还有个点是c++ 中 不要用 使用string s=""; char ch;s+=ch;
这种用法,即c++中, 空 string “”和char 不能执行加操作
AC代码:
#include <iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
int str2int(string s){
int ans=0;
int len=s.length();
for(int i=0;i<len;i++){
ans=ans*10+(s[i]-'0');
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
stack<string> ss;// stack string
stack<char> sn;// stack number
string ts; // temp string
string tn;// temp number
string s;
int len;
string tmp;
int tmpn;
if(T<=0) return 0;
while(T--){
while(!ss.empty()) ss.pop();
while(!sn.empty()) sn.pop();
ts="";
tn="";
cin>>s;
len=s.length();
tmp="";
for(int i=0;i<len;i++){
if(s[i]>='0'&&s[i]<='9'){
sn.push(s[i]);
}else if(s[i]=='('){
sn.push(s[i]);
ts=s[i];
ss.push(ts);
ts="";
}else if(s[i]>='a'&&s[i]<='z'){
if(sn.empty()||sn.top()=='('){
ts=s[i];
ss.push(ts);
ts="";
}
else{
tn="";
while(!sn.empty()&&sn.top()!='('){
tn=sn.top()+tn;
sn.pop();
}
tmpn=str2int(tn);
ts=s[i];
tmp="";
for(int j=0;j<tmpn;j++){
tmp=tmp+ts;
}
ss.push(tmp);
//reset;
ts="";
tmp="";
}
}else if(s[i]==')'){
tn="";
if(sn.top()=='(') sn.pop();
while(!sn.empty()&&sn.top()!='('){
tn=sn.top()+tn;
sn.pop();
}
tmpn=str2int(tn);
tn="";
ts="";
while(!ss.empty()&&ss.top()!="("){
ts=ss.top()+ts;
ss.pop();
}
tmp=ts;
for(int k=1;k<tmpn;k++){
tmp+=ts;
}
if(ss.top()=="(") ss.pop();
ss.push(tmp);
ts="";
}
}
tmp="";
while(!ss.empty()&&ss.top()!="("){
tmp=ss.top()+tmp;
ss.pop();
}
cout<<tmp<<endl;
}
return 0;
}