看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) DevC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 中序轉後序沒問題,問題卡在不知道怎麼求值 目前寫的是只能求個位數運算例如:4+3*9 因為轉成後序之後字元陣列我沒辦法分辨數字 問題是現在連單位數都做不出來,我是先把字串轉整數,可是還是有問題-.- 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 後序計算值有問題 程式碼(Code):(請善用置底文網頁, 記得排版) #include<iostream> #define N 100 #define operator(c) ((c=='+')||(c=='-')||(c=='*')||(c=='/'))?1:0 #define operands(c) ((c)>='0' && (c)<='9')?1:0 using namespace std; typedef struct{ int stackarray[N]; int sp; }Stack; int transform(char*,char*,Stack*); void push(Stack *,int); void pop(Stack *,int *); int in_stack_priority(int); int in_coming_priority(int); int evaluate(char *,Stack *); int cal(int,int,char); void pop2(Stack *,char *); int main(void){ Stack s; s.sp=-1; char input[N]; char final[N]; cout<<"請輸入中序運算式"; cin>>input; transform(input,final,&s); cout << "中序式 => " << input << " 後序式=> " <<final<<endl; cout<<"計算出來的值 => "<<evaluate(final,&s)<<endl; system("pause"); return 0; } int transform(char *infix,char *postfix,Stack *p){ int i=0,j=0; int element; char token; token=infix[i]; while(token!='\0'){ if(operands(token)) postfix[j++]=token; else if(token=='(') push(p,token); else if(token==')'){ while(p->sp>=0){ pop(p,&element); if(element=='(') break; postfix[j++]=element; } } else if(operator(token)){ while(p->sp!=-1){ element=p->stackarray[p->sp]; if((in_coming_priority(token))<=(in_stack_priority(element))){ pop(p,&element); postfix[j++]=element; } else break; } push(p,token); } i++; token=infix[i]; } while(p->sp!=-1){ pop(p,&element); postfix[j++]=element; } postfix[j]='\0'; } void push(Stack *p,int x){ p->sp++; p->stackarray[p->sp]=x; } void pop(Stack *p,int *x){ *x=p->stackarray[p->sp]; p->sp--; } int in_stack_priority(int c){ char op[5]={'(','+','-','*','/'}; char prio[5]={0,1,1,2,2}; for(int i=0;i<5;i++){ if(c==op[i]) return prio[i]; } } int in_coming_priority(int c){ char op[5]={'(','+','-','*','/'}; char prio[5]={4,1,1,2,2}; for(int i=0;i<5;i++){ if(c==op[i]) return prio[i]; } } int evaluate(char *postfix,Stack *p){ char token; int i=0; int result; int a,b; token=postfix[i]; char elem1[5],elem2[5]; while(token!='\0'){ if(operands(token)) push(p,token); else if(operator(token)) { pop2(p,elem2); pop2(p,elem1); a=atoi(elem2); b=atoi(elem1); result=cal(b,a,token); push(p,result); } i++; token=postfix[i]; } pop(p,&result); return result; } int cal(int x,int y,char c){ switch(c){ case '+': return x+y; break; case '-': return x-y; break; case '*': return x*y; break; case '/': return x/y; break; } } void push2(Stack *p,int x){ p->sp++; p->stackarray[p->sp]=x; } void pop2(Stack *p,char *x){ x[0]=p->stackarray[p->sp]; p->sp--; } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.253.192.142