將中綴表達式轉(zhuǎn)換為后綴表達式-C++程序(共3頁)_第1頁
將中綴表達式轉(zhuǎn)換為后綴表達式-C++程序(共3頁)_第2頁
將中綴表達式轉(zhuǎn)換為后綴表達式-C++程序(共3頁)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上5 將中綴表達式轉(zhuǎn)換為后綴表達式【問題描述】表達式轉(zhuǎn)換。輸入的中綴表達式為字符串,轉(zhuǎn)換得到的后綴表達式存入字符數(shù)組中并輸出。例如: a*(x+y)/(b-x) 轉(zhuǎn)換后得: a x y + * b x - /【數(shù)據(jù)結(jié)構(gòu)】l 定義一個暫時存放運算符的轉(zhuǎn)換工作棧opst。l 中綴表達式字符串char *infix;l 后綴表達式字符串char *postfix;【算法提示】轉(zhuǎn)換規(guī)則:把運算符移到它的兩個操作數(shù)后面,刪除掉所有的括號。從頭到尾掃描中綴表達式,對不同類型的字符按不同情況處理:l 數(shù)字或小數(shù)點,直接寫入字符串postfix,并在每個數(shù)值后面寫入一個空格;l 左括號

2、,進棧,直到遇見相配的右括號,才出棧;l 右括號,表明已掃描過括號內(nèi)的中綴表達式,把從棧頂直到對應(yīng)左括號之間的運算符依次退棧,并把結(jié)果推入棧內(nèi);l 對于運算符,分兩種情況處理:u 該運算符的優(yōu)先級大于棧頂符號的優(yōu)先級,則入棧;u 若該運算符的優(yōu)先級小于棧頂優(yōu)先級,則先彈出棧頂運算符、寫入postfix串;繼續(xù)將該運算符與棧頂運算符比較,直到能把它推入棧內(nèi)為止(即優(yōu)先級大于棧頂運算符)。說明:自行設(shè)計運算符優(yōu)先級的表示?!局饕a】專心-專注-專業(yè)#include<iostream.h>#include<assert.h>#include<math.h>#in

3、clude<string.h>const int stackIncreament=0;class opstpublic: opst(int sz=50) maxSize=sz; top=-1; elements=new charmaxSize; assert(elements!=NULL); opst()deleteelements; bool IsEmpty()return (top=-1)?true:false; bool IsFull()return (top=maxSize-1)?true:false; void Push( char &x); bool Pop(c

4、har &x); bool getTop(char &x); int getSize()constreturn top+1; void MakeEmpty()top=-1; void input(); void Convert(); friend ostream& operator<<(ostream &os,opst &s);private: char *elements; int top; int maxSize; void overflowProcess();void opst:overflowProcess()/溢出處理 char *

5、newArray=new charmaxSize+stackIncreament; for(int i=0;i<=top;i+) newArrayi=elementsi; maxSize=maxSize+stackIncreament; delete elements; elements=newArray;void opst:Push(char &x)if(IsFull()=true) overflowProcess();elements+top=x;bool opst:Pop( char &x) if(IsEmpty()=true) return false; x=el

6、ementstop-; return true;bool opst:getTop(char &x) if(IsEmpty()=true)return false; x=elementstop; return true;ostream& operator<<(ostream &os,opst &s) os<<"top="<<s.top<<endl; for(int i=0;i<=s.top;i+) os<<s.elementsi; return os;void opst:inpu

7、t() char ch20; cout<<"請輸入中綴表達式(括號不能省略):"<<endl; cin.getline(ch,20); int i=0; while(chi!='0') this->Push(chi);i+; chi='#'bool isdigit(char &x) if(x>='a'&&x<='z')|(x>='A'&&x<='Z')|(x>='0'

8、;&&x<='9') return true; else return false;int isp(char &x)/設(shè)置棧內(nèi)優(yōu)先級 switch(x) case '#': return 0;break; case '(': return 1;break; case '*': case '/': case '%': return 5;break; case '+': case '-': return 3;break; case '

9、)': return 6;break; int icp(char &x)/設(shè)置棧外優(yōu)先級 switch(x) case '#': return 0;break; case '(': return 6;break; case '*': case '/': case '%': return 4;break; case '+': case '-': return 2;break; case ')': return 1;break; void opst:Con

10、vert() opst s; int i=0; char ch='#',ch1,op; s.Push(ch); this->Push(ch); elementsi; while(this->IsEmpty()=false&&elementsi!='#') if(isdigit(elementsi) cout<<elementsi; i+; else s.getTop(ch1); if(isp(ch1)<icp(elementsi) s.Push(elementsi);i+; else if(isp(ch1)>icp(elementsi) s.Pop(op);cout<<op; else s.Pop(op); if(op='(') i+; void main() opst a; a.input(); cout<<"后綴表達式為:"<<endl; a.Convert(); cout<<endl;【實驗過程】請輸入中綴表達式(括號不能省略):(a+(b-c)/d)后綴表達式為:abc-d/+【實驗體會】怎么樣設(shè)置棧內(nèi)外的優(yōu)先級是解決這

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論