Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
拙劣的代码。估计没几个人看的明白一开始MLE,然后是TLE 。。。。。我的天,我快崩溃了。 然后我改了一个关键的地方,就是内存管理,我把释放的节点用一个RubLink储存,当需要再申请内存的时候,先检查RubLink是否有资源,有的话,就直接拿。140ms。 足以可见,计算机在分配内存的时候,需要耗费很多时间!!!!!!! 附代码: #include <stdio.h > #include <string.h> #include <stdlib.h> #define MAXSIZE 400 typedef struct stack{ char arr[MAXSIZE]; int top; }stack; typedef struct expreNode{ char s[MAXSIZE]; struct expreNode *next; char r;//c refer to the latest operation in a node }expreNode; void push(stack *s,char c) { (*s).arr[(*s).top++]=c; } char pop(stack *s) { return (*s).arr[--(*s).top]; } int empty(stack s) { return s.top==0?1:0; } int biger(char c,char p) { if((c=='*'||c=='/')&&(p=='+'||p=='-')) return 1; return 0; } int equal(char c,char p) { if((c=='+'||c=='-')&&(p=='+'||p=='-'))return 1; else if( (c=='*'||c=='/')&&(p=='*'||p=='/') )return 1; return 0; } int main() { stack op,dt; char expre[MAXSIZE],add[5]; int i,j,k,l,n; char c,temp,*s; expreNode *root; expreNode *RubLink,*RubHead;//用来处理垃圾内存 expreNode *p,*t; //printf("%d\n",equal('-','*')); scanf("%d",&n); RubLink=(expreNode*)malloc(sizeof(expreNode)); RubLink->next=NULL; RubHead=RubLink; for(i=0;i<n;i++)//将中缀表达式转换为前缀表达式 { scanf("%s",expre); op.top=0,dt.top=0; for(j=strlen(expre)-1;j>=0;j--) { c=expre[j]; if(c>='a'&&c<='z') {push(&dt,c);}//printf("push %c to dt \n",c);} else if(c=='+'||c=='-'||c=='*'||c=='/') { pro:if(empty(op)||op.arr[op.top-1]==')'|| (biger(c,op.arr[op.top-1])||equal(c,op.arr[op.top-1]) ) )//伪代码 push(&op,c); else { temp=pop(&op); push(&dt,temp); goto pro; } } else if(c=='('||c==')') { if(c==')')push(&op,c); else{//左括号 while(op.arr[op.top-1]!=')'&&op.top>=0)push(&dt,pop(&op)); pop(&op); //丢弃右括号 continue;//丢弃左括号,即不对c作任何处理 } } } while(!empty(op))push(&dt,pop(&op));//至此dt就是前缀表达式 while(!empty(dt))push(&op,pop(&dt));//将前缀表达式翻转 root=(expreNode*)malloc(sizeof(expreNode)); root->next=NULL; while(!empty(op)) { c=pop(&op); if(c>='a'&&c<='z') { if(RubHead->next!=NULL) {t=RubHead->next;RubHead->next=RubHead->next->next;} else t=(expreNode*)malloc(sizeof(expreNode)); add[0]=c,add[1]='\0'; strcpy(t->s,add); t->r='/'; t->next=root->next; root->next=t; //用链表来模仿栈 } else if(c=='+'||c=='-'||c=='*'||c=='/') { add[0]=c,add[1]='\0'; if(biger(c,root->next->r)||biger(c,root->next->next->r)||c=='-'||c=='/')//需要添加括号的情况 { if(biger(c,root->next->r)) { strcpy(expre,"("),strcat(expre,root->next->s),strcat(expre,")"); strcpy(root->next->s,expre); } if( biger(c,root->next->next->r)||(c=='-'&&equal(c,root->next->next->r))|| (c=='/'&&strlen(root->next->next->s)>1) ) { strcpy(expre,"("),strcat(expre,root->next->next->s); strcat(expre,")"),strcpy(root->next->next->s,expre); } strcat(root->next->s,add),strcat(root->next->s,root->next->next->s); } else{ strcat(root->next->s,add),strcat(root->next->s,root->next->next->s); } p=root->next->next; root->next->next = p->next; root->next->r=c; p->next=RubHead->next; RubHead->next=p; } } printf("%s\n",root->next->s); free(root->next),free(root); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator