模拟
View Code
#include <iostream> #include <string> using namespace std; const int maxn=59; char st[1000]; int vertex[maxn][maxn],mark[maxn],marknum,vertexnum[maxn],stl[maxn*3],stlnum; void init() { memset(vertex,0,sizeof(vertex)); memset(mark,0,sizeof(mark)); memset(vertexnum,0,sizeof(vertexnum)); marknum=0; stlnum=0; } void del(int x,int y) { for (int i=1;i<=vertexnum[x];i++) if (vertex[x][i]==y) { vertex[x][i]=vertex[x][vertexnum[x]]; vertexnum[x]--; return; } } void make() { int len=strlen(st),i,temp=0; bool did=true; for (i=0;i<=len-1;i++) if(st[i]==')') { if (!did) { stl[++stlnum]=temp; temp=0; did=true; } stl[++stlnum]=-1; } else if (st[i]=='(') { if (!did) { stl[++stlnum]=temp; temp=0; did=true; } } else if (st[i]>='0'&&st[i]<='9') { temp=temp*10+st[i]-48; did=false; } } void work() { int i=0,stack[maxn],min,j,stacknum=0; make(); stacknum++; stack[1]=stl[1]; marknum=1; mark[1]=stack[1]; for (i=2;i<=stlnum;i++) { if (stl[i]==-1) stacknum--; else { stack[++stacknum]=stl[i]; vertex[stack[stacknum]][++vertexnum[stack[stacknum]]]=stack[stacknum-1]; vertex[stack[stacknum-1]][++vertexnum[stack[stacknum-1]]]=stack[stacknum]; mark[++marknum]=stl[i]; } } for (i=1;i<marknum;i++) { min=-1; for (j=1;j<=marknum;j++) if ((vertexnum[mark[j]]==1)&&(min==-1||min>mark[j])) min=mark[j]; if (i!=1) cout<<" "; cout<<vertex[min][1]; del(vertex[min][1],min); vertexnum[min]=0; } cout<<endl; } int main() { // freopen("t.txt","r",stdin); while (gets(st)) { init(); work(); } return 0; }