




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、c語言實現中綴,后綴,前綴表達式轉換并求值 九 #include<stdio.h> #include<stdlib.h>#define MAXNUM 100typedef struct Node /定義存儲中綴表達式的結點類型int data;int data1;char data2;struct Node *next;Lnode; typedef struct Node2 /定義存儲前綴表達式的結點類型int data;int data1;char data2;struct Node2 *next;struct Node2 *prior
2、;Lnode2; typedef int selemtype1; /定義運算數棧的結點typedef struct /定義運算數棧的類型selemtype1 *base;selemtype1 *top;sqstack1;void InitStack1(sqstack1 &s) /新建一個空運算數棧s.base=(selemtype1 *)malloc(MAXNUM*sizeof(selemtype1);s.top=s.base;if(!s.base) printf("出錯:申請空間失敗!n"); void Push1(sqstack1 &am
3、p;amp;s,selemtype1 &e) /運算數棧,入棧:插入元素e為新的棧頂元素 if(s.top-s.base>=MAXNUM)printf("出錯:表達式過長!1n");*s.top+ =e; void GetTop1(sqstack1 s,selemtype1 &e) /運算數棧,用e返回棧頂元素e=*(s.top-1);void Popopnd1(sqstack1 &s,selemtype1 &e) /運算數棧,退棧:刪除棧頂元素,并用e返回其值e=*-s.top;
4、int stackempy1(sqstack1 s) /運算數棧,若為空棧返回1,否則返回0if(s.top=s.base) return 1;else return 0;typedef char selemtype2; /定義運算符棧的結點類型typedef struct /定義運算符棧類型selemtype2 *base;selemtype2 *top;sqstack2;void InitStack2(sqstack2 &s) /新建一個空運算符棧s.base=(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2);s.top=s.ba
5、se;if(!s.base) printf("出錯:申請空間失敗!n"); void Push2(sqstack2 &s,selemtype2 &e) /運算符棧,入棧:插入元素e為新的棧頂元素 if(s.top-s.base>=MAXNUM)printf("出錯:表達式過長!2n");*s.top+ =e;void GetTop2(sqstack2 s,selemtype2 &e) /運算符棧,用e返回棧頂元素e=*(s.top-1);void Popopnd
6、2(sqstack2 &s,selemtype2 &e) /運算符棧,退棧:刪除棧頂元素,并用e返回其值e=*-s.top;int stackempy2(sqstack2 s) /運算符棧,若為空棧返回1,否則返回0if(s.top=s.base) return 1;else return 0;void priority(char c,int &i) /確定運算符優先級if (c='*'|c='/'|c='%') i=2 ;else if (c=&am
7、p;#39;+'|c='-') i=1 ;else i=0;int compare(char a,char b) /比較棧頂元素運算符與外部運算符優先級大小,外部優先級大則返回1,反之返回0int in,out;priority(a,in);priority(b,out);if(out>in) return 1;else return 0;void Operat(sqstack1 &OPND,sqstack2 &OPTR)int num1,num2,num;char c;Popopnd1(OPND,n
8、um2);Popopnd1(OPND,num1);Popopnd2(OPTR,c);switch(c)case '+':num=num1+num2;break;case '-':num=num1-num2;break;case '*':num=num1*num2;break;case '/':num=num1/num2;break;case '%':num=num1%num2;break;Push1(OPND, num); void O
9、peratqianzhui(sqstack1 &OPND,sqstack2 &OPTR)int num1,num2,num;char c;Popopnd1(OPND,num1);Popopnd1(OPND,num2);Popopnd2(OPTR,c);switch(c)case '+':num=num1+num2;break;case '-':num=num1-num2;break;case '*':num=num1*num2;break;case '
10、/':num=num1/num2;break;case '%':num=num1%num2;break;Push1(OPND,num); void houzhuiqiuzhi(Lnode *p,int &e) /后綴表達式求值sqstack1 OPND; /運算數棧sqstack2 OPTR; /運算符棧int n;char c;p=p->next;InitStack1(OPND);InitStack2(OPTR);while(p)switch(p->data)case 1:n=p->da
11、ta1;Push1(OPND,n);break;case 2:c=p->data2;Push2(OPTR,c);Operat(OPND,OPTR);break;default:printf("結點有誤");break;p=p->next;Popopnd1(OPND,n);e=n;void zhongzhui(Lnode *p) /中綴表達式求值sqstack1 OPND; /運算數棧sqstack2 OPTR; /運算符棧int n;char c,c2;Lnode *first;first=p;p=p->next;I
12、nitStack1(OPND);InitStack2(OPTR);while(!stackempy2(OPTR)|p)while(p)switch(p->data)case 1:n=p->data1;Push1(OPND,n);break;case 2:c=p->data2;if(stackempy2(OPTR) Push2(OPTR,c);else switch(c)case '(': Push2(OPTR,c);break;case ')': GetTop2(OPTR,c2);whil
13、e(c2!='(')Operat(OPND,OPTR);GetTop2(OPTR,c2);Popopnd2(OPTR,c2);break;default: GetTop2(OPTR,c2);if(compare(c2,c) Push2(OPTR,c);else Operat(OPND,OPTR);Push2(OPTR,c);break;break;default: printf("結點有誤");break;p=p->next;while(!stackempy2(OPTR)Operat(OPND,OPTR);Pop
14、opnd1(OPND,n);p=first->next;while(p)if(p->data=1) printf("%d ",p->data1);if(p->data=2) printf("%c",p->data2);p=p->next;printf("=%d ",n);void houzhui(Lnode *p) /中綴表達式轉化為后綴表達式sqstack2 OPTR; /運算符棧Lnode *r,*q
15、,*head;int n;char c,c2;InitStack2(OPTR);p=p->next;q=(Lnode*)malloc(sizeof(struct Node);head=q;while(p) switch(p->data)case 1:n=p->data1;r=(Lnode*)malloc(sizeof(struct Node); q->next=r;q=q->next;q->data=1;q->data1=n; break;case 2:c=p->data2;if(s
16、tackempy2(OPTR) Push2(OPTR,c);else switch(c) case '(': Push2(OPTR,c);break;case ')': Popopnd2(OPTR,c2);while(c2!='(') r=(Lnode*)malloc(sizeof(struct Node); q->next=r;q=q->next;q->data=2;q->data2=c2; Popopnd2(OPTR,c2);break;d
17、efault: GetTop2(OPTR,c2);while(!compare(c2,c) Popopnd2(OPTR,c2);r=(Lnode*)malloc(sizeof(struct Node); q->next=r;q=q->next;q->data=2;q->data2=c2;GetTop2(OPTR,c2); Push2(OPTR,c);break; break;default: printf("結點有誤");break;p=p->next;while(!stackempy2(
18、OPTR) Popopnd2(OPTR,c2);r=(Lnode*)malloc(sizeof(struct Node); q->next=r;q=q->next;q->data=2;q->data2=c2; q->next=NULL;q=head->next;while(q)if(q->data=1) printf("%d ",q->data1);if(q->data=2) printf("%c"
19、,q->data2);q=q->next;houzhuiqiuzhi(head,n);printf("=%d ",n);void qianzhuiqiuzhi(Lnode2 *p,int &e) /前綴表達式求值sqstack1 OPND; /運算數棧sqstack2 OPTR; /運算符棧int n;char c;Lnode2 *head;head=p;p=p->next;InitStack1(OPND);InitStack2(OPTR);while(p!=head)switch(p->
20、;data)case 1:n=p->data1;Push1(OPND,n);break;case 2:c=p->data2;Push2(OPTR,c);Operatqianzhui(OPND,OPTR);break;default:printf("結點有誤");break;p=p->next;Popopnd1(OPND,n);e=n;void qianzhui(Lnode *p) /中綴表達式轉化為前綴表達式sqstack2 OPTR; /運算符棧InitStack2(OPTR);int n;char c,c2;Ln
21、ode *first;Lnode2 *q,*head,*r,*head2,*s;first=p;p=p->next;q=(Lnode2*)malloc(sizeof(struct Node2); /建立存中綴表達式的雙向循環鏈表head=q;while(p)r=(Lnode2*)malloc(sizeof(struct Node2);q->next=r;r->prior=q;q=q->next;q->data=p->data;q->data1=p->data1;q->d
22、ata2=p->data2;p=p->next;q->next=head;head->prior=q;s=(Lnode2*)malloc(sizeof(struct Node2); /建立存前綴表達式的雙向循環鏈表head2=s;while(q!=head)switch(q->data)case 1:n=q->data1;r=(Lnode2*)ma lloc(sizeof(struct Node2);s->next=r;r->prior=s;s=s->next;s-&a
23、mp;gt;data=1;s->data1=n; break;case 2:c=q->data2;if(stackempy2(OPTR) Push2(OPTR,c);else GetTop2(OPTR,c2);if(c2=')') Push2(OPTR,c);else switch(c) case ')':Push2(OPTR,c);break;case '(': Popopnd2(OPTR,c2);while(c2!=')') r=(Ln
24、ode2*)malloc(sizeof(struct Node2);s->next=r;r->prior=s;s=s->next;s->data=2;s->data2=c2; Popopnd2(OPTR,c2);break;default: GetTop2(OPTR,c2);while(!compare(c2,c) Popopnd2(OPTR,c2);r=(Lnode2*)malloc(sizeof(struct Node2);s->next=r;r->prior=s;s=s->ne
25、xt;s->data=2;s->data2=c2;GetTop2(OPTR,c2); Push2(OPTR,c);break; break;default:printf("結點有誤");break;q=q->prior;while(!stackempy2(OPTR) Popopnd2(OPTR,c2);r=(Lnode2*)malloc(sizeof(struct Node2);s->next=r;r->prior=s;s=s->next;s->data=2;s
26、->data2=c2; s->next=head2;head2->prior=s;while(s!=head2)if(s->data=1) printf("%d ",s->data1);if(s->data=2) printf("%c",s->data2);s=s->prior;qianzhuiqiuzhi(head2,n);printf("=%d ",n);int main(
27、) char n10;char c;int i,j,k,a,b,z,y,e;Lnode *p,*q,*first;i=0;e=1;a=0;b=1;z=0;y=0;p=(Lnode*)malloc(sizeof(struct Node);first=p;printf("請輸入中綴表達式");do c = getchar();if('0'<=c&&c<='9') ni=c;i+; else switch (c) case '
28、+': case '-': case '*': case '/': case '%': case '(': case ')': case 'n': if(n0>'0'&&n0<='9') q=(Lnode*)malloc(sizeof(struct Node);p->next=q;p=p->next;for(k=0;k<i;k+) for(j=0;j<=i-k-2;j+)e=e*10; a=a+(nk-'0')*e;e=1;nk='0'p-&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術類培訓管理制度
- 蘇州家紡店管理制度
- 茶樓茶藝師管理制度
- 集中充電樁管理制度
- 小學語文《小公雞和小鴨子》課件
- 畢業設計(論文)答辯 -后擾流板對汽車氣動特性影響的仿真分析
- 廣西欽州市第四中學2024-2025學年高一下學期學業水平合格性考試模擬試卷地理試卷(九)(含答案)
- 幼兒園大班《認識人民幣》教案
- 從職業生涯規劃書看舞蹈生的成長之路
- 山東中考濟寧題目及答案
- 醫療物資配送應急預案
- 《工程勘察設計收費標準》(2002年修訂本)-完整版-1
- 【MOOC】材料力學-江蘇科技大學 中國大學慕課MOOC答案
- 物流公司合同范例范例
- 衛星導航產品培訓
- 江蘇省揚州市2024年化學中考試題【附答案】
- 2023-2024學年廣東省深圳市南山區八年級(下)期末歷史試卷
- 食品應急演練課件
- 鉗工基礎知識-刮削
- 課后服務家長滿意度調查表
- (完整版)西泠印社出版社三年級下冊《書法練習指導》完整教案
評論
0/150
提交評論