版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、北京郵電大學(xué)信息與通信工程學(xué)院數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱: 實(shí)驗(yàn)4棧的應(yīng)用學(xué)生姓名: 班 級: 班內(nèi)序號: 15學(xué) 號: 日 期: 2015年12月28日1 實(shí)驗(yàn)要求表達(dá)式求值是程序設(shè)計(jì)語言編譯中最近本的問題,它要求把一個(gè)表達(dá)式翻譯成能夠直接求值的序列。例如用戶輸入字符串“14+(13-2)*2-11*5)*2”,程序可以自動計(jì)算得到最終的結(jié)果。在這里,我們將問題簡化,假定算數(shù)表達(dá)式的值均為非負(fù)整數(shù)常數(shù),不包含變量、小數(shù)和字符常量。試設(shè)計(jì)一個(gè)算術(shù)四則運(yùn)算表達(dá)式求值的簡單計(jì)算器?;疽螅?、 操作數(shù)均為非負(fù)整數(shù)常數(shù),操作符僅為+、-、*、/、(和);2、 編寫main函數(shù)進(jìn)行測試。2.1 存儲結(jié)
2、構(gòu) 順序棧: int型數(shù)字棧 char型字符棧/*-+121 Top=-1 Top=-1 2.2 關(guān)鍵算法分析1.判斷輸入字符是否為運(yùn)算符int IsOpr(char c) /判斷輸入字符是否為運(yùn)算符 if (c='+'|c='-'|c='*'|c='/'|c='('|c=')'|c='#') return 1; else return 0; 2. 判斷字符的優(yōu)先級將判斷條件分為多種情況:如果棧頂元素是+、-的情況與剛?cè)〉玫淖址笮”容^如果是+、-則返回>,如果是*、/則返回&
3、lt;,如果是左括號則返回<,如果是右括號則返回>,其他情況則返回>如果棧頂元素是*、/的情況與剛?cè)〉玫淖址笮”容^如果是+、-則返回>,如果是*、/則返回>,如果是左括號則返回<,如果是右括號則返回>,其他情況則返回>如果棧頂元素是(的情況與剛?cè)〉玫淖址笮”容^,除了右括號是=以外,其他都是返回<如果棧頂元素是)的情況與剛?cè)〉玫淖址笮”容^,都是返回>如果棧頂元素是#的情況與剛?cè)〉玫淖址笮”容^,除了#返回=以外,其他都是返回>這個(gè)方法即將中序表達(dá)式轉(zhuǎn)換為后綴表達(dá)式char Precede(char s,char c) /判斷
4、字符的優(yōu)先級 switch(s) case '+': case '-': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '<' else if(c='(') return '<' else if(c=')') return '>' else return '>' break; case '
5、;*': case '/': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '>' else if(c='(') return '<' else if(c=')') return '>' else return '>' break; case '(': if(c=')')
6、 return '=' else return '<' break; case ')': return '>' break; case '#': if(c='#') return '=' else return '<' break; 3.計(jì)算int Operate(int x,char opr,int y) /計(jì)算 int result; switch (opr) case '+': result = x + y; break; ca
7、se '-': result = x - y; break; case '*': result = x * y; break; case '/': result = x / y; break; return result; 3. 程序運(yùn)行結(jié)果程序運(yùn)行圖開始 定義數(shù)字棧S1符號棧S2輸入字符串S讀取字符SjSj!=0 N YSj是計(jì)算符號? NS1.push(sj) Y與棧頂符號比較優(yōu)先級結(jié)束循環(huán)J+輸出S1.POP><Theta=S2.pop ( )=S2.pop ( )S2.push(sj)結(jié)束a=S1.pop ( )J+J+b=S
8、1.pop ( )計(jì)算(a,theta,b)S1.push(結(jié)果)源代碼:#include<iostream>#include<string>using namespace std;const int Max=128;template<class T>class Stackpublic:Stack()top=-1;void Push(T x); /入棧T Pop(); /進(jìn)棧T GetTop(); /取棧頂元素int isEmpty(); /判斷棧是否為空private:int top;T dataMax;template<class T>voi
9、d Stack<T>:Push(T x)if(top>=Max-1) throw "上溢"top +;datatop=x;template<class T>T Stack<T>:Pop()if(isEmpty() throw "下溢"top-;return datatop+1;template<class T>T Stack<T>:GetTop()if(isEmpty()throw "下溢"return datatop;template<class T>in
10、t Stack<T>:isEmpty()if(top=-1)return 1;elsereturn 0;int IsOpr(char c); /判斷輸入字符是否為運(yùn)算符 char Precede(char s,char c); /判斷字符的優(yōu)先級 int Operate(int x,char opr,int y); /計(jì)算 int IsOpr(char c) /判斷輸入字符是否為運(yùn)算符 if (c='+'|c='-'|c='*'|c='/'|c='('|c=')'|c='#
11、9;) return 1; else return 0; char Precede(char s,char c) /判斷字符的優(yōu)先級 switch(s) case '+': case '-': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '<' else if(c='(') return '<' else if(c=')') retur
12、n '>' else return '>' break; case '*': case '/': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '>' else if(c='(') return '<' else if(c=')') return '>' else retu
13、rn '>' break; case '(': if(c=')') return '=' else return '<' break; case ')': return '>' break; case '#': if(c='#') return '=' else return '<' break; int Operate(int x,char opr,int y) /計(jì)算 int result;
14、switch (opr) case '+': result = x + y; break; case '-': result = x - y; break; case '*': result = x * y; break; case '/': result = x / y; break; return result; void main()Stack<int> s1;/運(yùn)算數(shù)棧Stack<char> s2;/運(yùn)算符棧s2.Push('#');int a,b,result,i,n,j=0; c
15、har theta;string s;cout<<"請輸入算式,出入#號結(jié)束"<<endl;cin>>s;while(sj!='0')if(!IsOpr(sj) /是運(yùn)算數(shù)的情況 i=sj-'0'/將字符型轉(zhuǎn)為整型j+; while(!IsOpr(sj) /使得可以輸入幾位數(shù) n=sj-'0'i=i*10+n;j+; s1.Push(i); else switch(Precede(s2.GetTop(),sj) /比較棧頂運(yùn)算符和剛輸入運(yùn)算符的優(yōu)先級 case '<':
16、 s2.Push(sj); j+; break; case '=': theta=s2.Pop(); j+;break; case '>': theta=s2.Pop(); b=s1.Pop(); a=s1.Pop(); result=Operate(a,theta,b); s1.Push(result); break; cout<<s1.GetTop()<<endl;4. 總結(jié)這次的實(shí)驗(yàn)選了題目四,用棧做計(jì)算器,在寫之前一直覺得這是一個(gè)很簡單的實(shí)驗(yàn),主要是在網(wǎng)上看到棧做計(jì)算器的想,所以覺得應(yīng)該沒什么難度,但是真正做起來才發(fā)現(xiàn)難上加難。尤其是在做中綴轉(zhuǎn)成后綴的時(shí)候,其實(shí)這個(gè)本來有個(gè)想法是用樹來做,中綴表達(dá)式是樹的中序遍歷(當(dāng)然要注意運(yùn)算符的優(yōu)先級),而后綴表達(dá)式是樹的后序遍歷,最初的想法是將中綴表達(dá)式轉(zhuǎn)化成為樹,然后對樹做后序遍歷就能得到后綴表達(dá)式,但是此次實(shí)驗(yàn)是以棧、隊(duì)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度毛石石材工程設(shè)計(jì)合同2篇
- 二零二五年度家庭和睦保障-夫妻暫時(shí)分居協(xié)議3篇
- 安全生產(chǎn)事故隱患排查監(jiān)管責(zé)任制度模版(2篇)
- 安全監(jiān)督副站長崗位職責(zé)模版(2篇)
- 2025年運(yùn)動會開幕式致辭稿(2篇)
- 二零二五年度水利工程車輛土石方運(yùn)輸與進(jìn)度款支付合同3篇
- 二零二五年度文化企業(yè)股東權(quán)益保護(hù)與公司運(yùn)營協(xié)議書3篇
- 2025年外研銜接版第二冊地理下冊階段測試試卷
- 2024年綠色養(yǎng)生酒訂購協(xié)議書版B版
- 二零二五年度商場停車場智能化管理系統(tǒng)合同2篇
- 生產(chǎn)能力證明(2023年)
- 第四章 壓力容器設(shè)計(jì)4.3
- 糖尿病性胃輕癱的護(hù)理課件
- 黔東南州2022~2023學(xué)年六年級數(shù)學(xué)(上冊)期末文化水平測試
- 電動牽引車設(shè)備安全操作規(guī)定
- 監(jiān)控系統(tǒng)說明
- 針對行政拘留的行政復(fù)議申請書
- 紫金礦業(yè)污染事件商業(yè)倫理分析
- 部編版語文六年級下冊第一單元多姿多彩的八方習(xí)俗大單元整體教學(xué)設(shè)計(jì)
- 2023春國家開放大學(xué)-02272數(shù)據(jù)結(jié)構(gòu)(本)-期末考試題帶答案
- Nikon Z6 Z7 數(shù)碼微單攝影技巧大全
評論
0/150
提交評論