中序轉後序求值 |
尚未結案
|
king917018
一般會員 發表:3 回覆:1 積分:0 註冊:2005-04-08 發送簡訊給我 |
#include上面的程式可以輸出中序轉後序~~但要如何把後序的值給輸出出來呢~~拜託各位大大~ 1.勿以求救...等無意義字眼當主題 2.PO程式碼請參考版規說明,下次就會直接把該文章刪除發表人 - taishyang 於 2005/04/08 18:47:31 |
ccobj
一般會員 發表:6 回覆:27 積分:21 註冊:2003-12-02 發送簡訊給我 |
|
ccobj
一般會員 發表:6 回覆:27 積分:21 註冊:2003-12-02 發送簡訊給我 |
//--------------------------------------------------------------------//管理堆疊的物件 class tstack { private: tstack *next; public: tstack *node; String data; tstack() { node=NULL; next=NULL; data=""; } ~tstack() { while (node!=NULL) { pop(); } } void push(String value) { tstack *newnode=new tstack; newnode->next=node; newnode->data=value; node=newnode; } String pop() { tstack *top; String value; if(node!=NULL) { top=node; node=node->next; value=top->data; delete top; }else{ value=""; } return value; } }stack,opstack; //--------------------------------------------------------------------//一個連結串列的結構 struct node { String data; node *next; }; //--------------------------------------------------------------------//判斷是否為運算子 int isop(String op) { char ops=op[1]; switch (ops) { case '(': case ')': case ' ': case '-': case '*': case '/':return 1; default:return 0; } } //--------------------------------------------------------------------//判斷運算子優先順序 int priority(String op) { char ops=op[1]; switch (ops) { case NULL:return -1; case '(': case ')':return 1; case ' ': case '-':return 2; case '*': case '/':return 3; default:return 0; } } //--------------------------------------------------------------------//檢查字串最後一個字 String endstr(String instr) { String outstr=instr.SubString(instr.Length(),1); return outstr; } //--------------------------------------------------------------------//可處理包含小數的四則運算 String alu(String alu1,String alu2,String op) { char ops=op[1]; String res; switch (ops) { case ' ': res=FloatToStr(StrToFloat(alu1) StrToFloat(alu2)); break; case '-': res=FloatToStr(StrToFloat(alu1)-StrToFloat(alu2)); break; case '*': res=FloatToStr(StrToFloat(alu1)*StrToFloat(alu2)); break; case '/': res=FloatToStr(StrToFloat(alu1)/StrToFloat(alu2)); break; } return res; } //--------------------------------------------------------------------//連結串列增加一節點 node *newlink(node *objlink,String value) { node *newnode=new node; if (objlink!=NULL) { newnode->next=NULL; newnode->data=value; objlink->next=newnode; objlink=newnode; }else{ newnode->next=NULL; newnode->data=value; objlink=newnode; } return objlink; } //--------------------------------------------------------------------//分離運算元與運算子,用link串聯起來 node *CutString(String inorder) { int op=0; int old=0; int cnt=1; int count=0; node *InorderHead=NULL; node *InorderTail=NULL; String tempstr; for (int i=1;i<=inorder.Length();i ) { if ((inorder[i]=='-') && (i<2 || priority(inorder[i-1])>1)) { tempstr=tempstr "(-1)*"; }else{ tempstr=tempstr inorder[i]; } } old=0; String a; for (int i=1;i<=tempstr.Length() 1;i ) { if (i<=tempstr.Length()) { op=priority(tempstr.SubString(i,1)); }else{ op=-1; } if (old!=op || isop(tempstr.SubString(i,1))) { if (!(tempstr.SubString(i-1,1)=="-" && (priority(tempstr.SubString(i-2,1))>1 || tempstr.SubString(i-2,1)=="("))) { a=tempstr.SubString(cnt,i-cnt); InorderTail=newlink(InorderTail,tempstr.SubString(cnt,i-cnt)); cnt=i; if (count==0) { InorderHead=InorderTail; count=1; } } } old=op; } return InorderHead; } //--------------------------------------------------------------------//將中序轉為後序 String conv(node *Inorder) { String postorder; String op=0,alu1,alu2; node *del; while (Inorder!=NULL) { if (isop(Inorder->data) && Inorder->data.Length()==1) { if (opstack.node==NULL || Inorder->data=="(") { opstack.push(Inorder->data); }else{ if (Inorder->data==")") { while(opstack.node->data!="(") { op=opstack.pop(); alu1=stack.pop(); alu2=stack.pop(); stack.push(alu(alu2,alu1,op)); postorder =" " op; } op=opstack.pop(); }else{ while(opstack.node!=NULL && priority(Inorder->data) <= priority(opstack.node->data)) { op=opstack.pop(); alu1=stack.pop(); alu2=stack.pop(); stack.push(alu(alu2,alu1,op)); postorder =" " op; } opstack.push(Inorder->data); } } }else{ stack.push(Inorder->data); postorder =" " Inorder->data; } del=Inorder; Inorder=Inorder->next; delete del; } while (opstack.node!=NULL) { op=opstack.pop(); alu1=stack.pop(); alu2=stack.pop(); stack.push(alu(alu2,alu1,op)); postorder =" " op; } return postorder; }剛好以前有做過 把我的CODE給你參考看看 因為老師規定不能用內建的STACK函式 所以有做一個STACK的物件來管理 呼叫的方法是 Edit2->Text=conv(CutString(Edit1->Text)) " = " stack.node->data;發表人 - ccobj 於 2005/04/09 11:57:52 |
king917018
一般會員 發表:3 回覆:1 積分:0 註冊:2005-04-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |