版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1.問題描述(1)表達式求值問題 表達式是數(shù)據(jù)運算的基本形式。人們的書寫習(xí)慣是中綴式,如:11+22*(7-4)/3。中綴式的計算按運算符的優(yōu)先級及括號優(yōu)先的原則,相同級別從左到右進行計算。表達式還有后綴式(如:22 7 4 - * 3 / 11 +)和前綴式(如:+ 11 / * 22 7 4 3)。后綴表達式和前綴表達式中沒有括號,給計算帶來方便。如后綴式計算時按運算符出現(xiàn)的先后進行計算。本設(shè)計的主要任務(wù)是進行表達式形式的轉(zhuǎn)換及不同形式的表達式計算。2. 數(shù)據(jù)結(jié)構(gòu)設(shè)計(1)表達式求值問題 由于表達式中有字符與數(shù)字兩種類型,故定義結(jié)點一個標志域data,標志結(jié)點存儲的為字符data=2還是數(shù)
2、字data=1,再尋找結(jié)點中對應(yīng)的存儲位置,讀取數(shù)字域data1,字符域data2。而在前綴表達式時,存在表達式逆序,因表達式類型不統(tǒng)一,用棧逆序極不方便,選擇構(gòu)建雙向鏈表,存儲表達式。typedef struct Node /定義存儲中綴表達式的結(jié)點類型int data; int data1; char data2; struct Node *next;Lnode; typedef struct Node2 /定義存儲前綴表達式的結(jié)點類型int data; int data1; char data2; struct Node2 *next; struct Node2 *prior;Lnode
3、2; 3. 運行、測試與分析(1)表達式求值問題(1)按提示輸入中綴表達式,如圖1.1所示。如輸入中綴表達式不正確,提示輸入有誤,如圖1.2,1.3所示。圖1.1圖1.2圖1.3(2) 選擇表達式轉(zhuǎn)換并求值方式。按“1”選擇中綴表達式求值,如圖1.4所示。圖1.4(3)按“2”選擇中綴表達式轉(zhuǎn)變?yōu)楹缶Y表達式并求值,如圖1.5所示。圖1.5(4) 按“3”選擇中綴表達式轉(zhuǎn)變?yōu)榍熬Y表達式并求值,如圖1.6所示。圖1.6附錄:源代碼(1)表達式求值問題#include<stdio.h> #include<stdlib.h>#define MAXNUM 100typedef s
4、truct Node /定義存儲中綴表達式的結(jié)點類型int data; int data1; char data2; struct Node *next;Lnode; typedef struct Node2 /定義存儲前綴表達式的結(jié)點類型int data; int data1; char data2; struct Node2 *next; struct Node2 *prior;Lnode2; typedef int selemtype1; /定義運算數(shù)棧的結(jié)點typedef struct /定義運算數(shù)棧的類型selemtype1 *base; selemtype1 *top;sqstac
5、k1;void InitStack1(sqstack1 &s) /新建一個空運算數(shù)棧s.base=(selemtype1 *)malloc(MAXNUM*sizeof(selemtype1); s.top=s.base; if(!s.base) printf("出錯:申請空間失?。"); void Push1(sqstack1 &s,selemtype1 &e) /運算數(shù)棧,入棧:插入元素e為新的棧頂元素 if(s.top-s.base>=MAXNUM) printf("出錯:表達式過長!1n"); *s.top+ =e;
6、 void GetTop1(sqstack1 s,selemtype1 &e) /運算數(shù)棧,用e返回棧頂元素e=*(s.top-1);void Popopnd1(sqstack1 &s,selemtype1 &e) /運算數(shù)棧,退棧:刪除棧頂元素,并用e返回其值e=*-s.top;int stackempy1(sqstack1 s) /運算數(shù)棧,若為空棧返回1,否則返回0if(s.top=s.base) return 1; else return 0;typedef char selemtype2; /定義運算符棧的結(jié)點類型typedef struct /定義運算符棧類
7、型selemtype2 *base; selemtype2 *top;sqstack2;void InitStack2(sqstack2 &s) /新建一個空運算符棧s.base=(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2); s.top=s.base; if(!s.base) printf("出錯:申請空間失??!n"); void Push2(sqstack2 &s,selemtype2 &e) /運算符棧,入棧:插入元素e為新的棧頂元素 if(s.top-s.base>=MAXNUM) pri
8、ntf("出錯:表達式過長!2n"); *s.top+ =e;void GetTop2(sqstack2 s,selemtype2 &e) /運算符棧,用e返回棧頂元素e=*(s.top-1);void Popopnd2(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
9、,int &i) /確定運算符優(yōu)先級if (c='*'|c='/'|c='%') i=2 ; else if (c='+'|c='-') i=1 ; else i=0;int compare(char a,char b) /比較棧頂元素運算符與外部運算符優(yōu)先級大小,外部優(yōu)先級大則返回1,反之返回0int in,out; priority(a,in); priority(b,out); if(out>in) return 1; else return 0;void Operat(sqstack1 &am
10、p;OPND,sqstack2 &OPTR)int num1,num2,num; char c; Popopnd1(OPND,num2); 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
11、%num2;break; Push1(OPND,num); void Operatqianzhui(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; c
12、ase '/':num=num1/num2;break; case '%':num=num1%num2;break; Push1(OPND,num); void houzhuiqiuzhi(Lnode *p,int &e) /后綴表達式求值sqstack1 OPND; /運算數(shù)棧 sqstack2 OPTR; /運算符棧 int n; char c; p=p->next; InitStack1(OPND); InitStack2(OPTR); while(p) switch(p->data) case 1:n=p->data1; Pus
13、h1(OPND,n); break; case 2:c=p->data2; Push2(OPTR,c); Operat(OPND,OPTR); break; default:printf("結(jié)點有誤"); break; p=p->next; Popopnd1(OPND,n);e=n;void zhongzhui(Lnode *p) /中綴表達式求值sqstack1 OPND; /運算數(shù)棧 sqstack2 OPTR; /運算符棧 int n; char c,c2; Lnode *first; first=p; p=p->next; InitStack1(O
14、PND); 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); while(c2!='(') Operat(
15、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("結(jié)點有誤"); break; p=p->next; while(!stackempy2(OPTR) Operat(OPND,OPTR); Popopnd1(OPND,n); p=first->nex
16、t; 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) /中綴表達式轉(zhuǎn)化為后綴表達式sqstack2 OPTR; /運算符棧 Lnode *r,*q,*head; int n; char c,c2; InitStack2(OPTR); p=p->next; q=(Lnode*)mal
17、loc(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(stackempy2(OPTR) Push2(OPTR,c); else switch(c) case '(': Push2(OPTR,c);break; case
18、 ')': 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; default: GetTop2(OPTR,c2); while(!compare(c2,c) Popopnd2(OPTR,c2); r=(Lnode*)malloc(sizeof(struct Node); q->next=r; q=q
19、->next; q->data=2; q->data2=c2; GetTop2(OPTR,c2); Push2(OPTR,c); break; break; default: printf("結(jié)點有誤"); break; p=p->next; while(!stackempy2(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;
20、q=head->next; while(q) if(q->data=1) printf("%d ",q->data1); if(q->data=2) printf("%c",q->data2); q=q->next; houzhuiqiuzhi(head,n); printf("=%d ",n);void qianzhuiqiuzhi(Lnode2 *p,int &e) /前綴表達式求值sqstack1 OPND; /運算數(shù)棧 sqstack2 OPTR; /運算符棧 int n; char
21、 c; Lnode2 *head; head=p; p=p->next; InitStack1(OPND); InitStack2(OPTR); while(p!=head) switch(p->data) case 1:n=p->data1; Push1(OPND,n); break; case 2:c=p->data2; Push2(OPTR,c); Operatqianzhui(OPND,OPTR); break; default:printf("結(jié)點有誤"); break; p=p->next; Popopnd1(OPND,n);e=n
22、;void qianzhui(Lnode *p) /中綴表達式轉(zhuǎn)化為前綴表達式sqstack2 OPTR; /運算符棧 InitStack2(OPTR); int n; char c,c2; Lnode *first; Lnode2 *q,*head,*r,*head2,*s; first=p; p=p->next; q=(Lnode2*)malloc(sizeof(struct Node2); /建立存中綴表達式的雙向循環(huán)鏈表 head=q; while(p) r=(Lnode2*)malloc(sizeof(struct Node2); q->next=r; r->pri
23、or=q; q=q->next; q->data=p->data; q->data1=p->data1; q->data2=p->data2; p=p->next; q->next=head; head->prior=q; s=(Lnode2*)malloc(sizeof(struct Node2); /建立存前綴表達式的雙向循環(huán)鏈表 head2=s; while(q!=head) switch(q->data) case 1:n=q->data1; r=(Lnode2*)malloc(sizeof(struct Node
24、2); s->next=r; r->prior=s; s=s->next; s->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!=
25、9;)') r=(Lnode2*)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->next; s
26、->data=2; s->data2=c2; GetTop2(OPTR,c2); Push2(OPTR,c); break; break; default:printf("結(jié)點有誤"); 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->data2=c2; s->next=h
27、ead2; 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() 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
28、;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 '+': case '-': case '*': case '/': case '%': case '(': case ')': case 'n': if(n0>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度廠房智能化管理系統(tǒng)設(shè)計與安裝合同3篇
- 二零二五年度智能家居升級二手房買賣定金合同2篇
- 2025年度健身房茶點餐飲合作經(jīng)營合同3篇
- 2025年度新能源儲能技術(shù)創(chuàng)業(yè)團隊合伙人股權(quán)分配與市場拓展協(xié)議3篇
- 2024食堂智慧化升級與勞務(wù)承包合作協(xié)議3篇
- 2025年度離婚房產(chǎn)過戶協(xié)議2篇
- 二零二五年度交通基礎(chǔ)設(shè)施建設(shè)財務(wù)管理與審計合同3篇
- 2024虛擬現(xiàn)實技術(shù)研發(fā)公司與游戲開發(fā)商之間的技術(shù)授權(quán)合同
- 2025年度高品質(zhì)蓄水池施工與后期水質(zhì)處理技術(shù)服務(wù)合同2篇
- 2025年度社區(qū)綜合服務(wù)設(shè)施維修與養(yǎng)護合同2篇
- 高層建筑幕墻事故應(yīng)急預(yù)案
- 孤獨癥兒童家庭康復(fù)訓(xùn)練課件
- 北師大版五年級數(shù)學(xué)下冊第3單元第2課時分數(shù)乘法(二)課件
- 教育部中國特色學(xué)徒制課題:中國特色學(xué)徒制制度設(shè)計與運行機制研究
- 城市規(guī)劃思想史
- 藍色3D風(fēng)工作總結(jié)匯報模板
- 山東師范大學(xué)新聞采訪期末復(fù)習(xí)題
- 小王子-英文原版
- 2024年江蘇省導(dǎo)游服務(wù)技能大賽理論考試題庫(含答案)
- 讓與擔(dān)保合同協(xié)議范本
- 2024年中考英語閱讀理解表格型解題技巧講解(含練習(xí)題及答案)
評論
0/150
提交評論