版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄
1概述................................................................2
1.1目的及意義..................................................................2
2系統(tǒng)分析..........................................................................2
2.1需求分析.....................................................................2
3概要設(shè)計(jì)..........................................................................2
3.1系統(tǒng)總體結(jié)構(gòu)............................................................2
3.2程序算法圖.................................................................2
4詳細(xì)設(shè)計(jì)..........................................................................3
4.1中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式.............................................3
4.1.1求運(yùn)算符優(yōu)先級(jí)函數(shù)...............................................4
4.1.2輸出隊(duì)列.............................................................4
4.2后綴表達(dá)式的求值........................................................4
5運(yùn)行與測(cè)試........................................................................5
5.1輸入5
5.2輸出結(jié)果:.............................................................5
6總結(jié)和心得........................................................................6
6.1心得與問(wèn)題.................................................................6
6.2總結(jié)..................................................................6
參考文獻(xiàn)............................................................................6
1概述
1.1目的及意義
我們?cè)诤茉绲臅r(shí)候就開(kāi)始學(xué)習(xí)書(shū)寫(xiě)及計(jì)算表達(dá)式,可以說(shuō)運(yùn)用起來(lái)很熟練了,但有時(shí)候
并不想自己計(jì)算,交給計(jì)算器是時(shí)有的事,然而普通的計(jì)算器并不懂得優(yōu)先級(jí),給計(jì)算帶來(lái)
了一定的不便。
本程序?qū)崿F(xiàn)的目的是將人們習(xí)慣的中綴表達(dá)式轉(zhuǎn)換為計(jì)算機(jī)所能理解的后綴表達(dá)式以
方便計(jì)算,最終得出我們所需要的正確的答案。
2系統(tǒng)分析
2.1需求分析
當(dāng)我們需要進(jìn)行一長(zhǎng)串的計(jì)算時(shí),各種運(yùn)算符夾雜在一起,通過(guò)筆算很容易得出結(jié)果。
然而計(jì)算機(jī)并沒(méi)有人腦那末聰明,它并不懂得先乘除后加減,有括號(hào)要先計(jì)算括號(hào)里面的,
它只知道從左到右的進(jìn)行計(jì)算,這就造成為了計(jì)算機(jī)計(jì)算的失誤,科學(xué)的計(jì)算是人們非常需
要
的計(jì)算工具。
3概要設(shè)計(jì)
3.1系統(tǒng)總體結(jié)構(gòu)
整個(gè)系統(tǒng)結(jié)構(gòu)如圖3-1-1所示,結(jié)構(gòu)非常清晰,程序順序執(zhí)行,首先提示用戶(hù)輸入需要
計(jì)算的表達(dá)式,經(jīng)過(guò)轉(zhuǎn)換得到后綴表達(dá)式,最后結(jié)果將數(shù)據(jù)顯示到主屏幕上即可。
圖3.1.1系統(tǒng)總體結(jié)構(gòu)圖
3.2程序算法圖
本程序所用的數(shù)據(jù)結(jié)構(gòu)類(lèi)型是棧和隊(duì)列。
2/11
首先提示用戶(hù)輸入中綴表達(dá)式,再利用程序?qū)⒅芯Y表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,其中數(shù)字
入隊(duì)列,算術(shù)運(yùn)算符入棧。
圖3.2.1程序算法圖
4詳細(xì)設(shè)計(jì)
4.1中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式
將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式首先需要掃描中綴表達(dá)式,當(dāng)遇到數(shù)字時(shí),將其入隊(duì)列,
當(dāng)遇到運(yùn)算符時(shí),若是低優(yōu)先級(jí)則直接入棧,若是高優(yōu)先級(jí)則將低優(yōu)先級(jí)運(yùn)算符彈出,并
入隊(duì)列,再將此次運(yùn)算符入棧,最終形成后綴表達(dá)式
圖4.1.1后綴表達(dá)式的轉(zhuǎn)換
其偽代碼算法如下:
switch(c){
caseOtocase:ErQeceQc)
ca^'(*:Rdi(S,c)
case*)t=Rp(S);
if(t!=r('&&t!=T#')
EnQueue(Q,t);
}v^iile(t!=f。&&S->tcp!-l);
ca?*+*||ca?—11ca^**'IIcase71:
while(Priority(c)<=Priority(GetTcp(S)))〃比較優(yōu)先級(jí)
EnQueue(Q,Pop(S))
Push⑸c)
)
3/11
4.1.1求運(yùn)算符優(yōu)先級(jí)函數(shù)
算術(shù)運(yùn)算符入棧時(shí)必須考慮運(yùn)算符的優(yōu)先級(jí),才干形成正確的后綴表達(dá)式,當(dāng)讀到運(yùn)算
符時(shí),將棧中所有優(yōu)先級(jí)高于或者等于該運(yùn)算符的運(yùn)算符彈出,送至輸出隊(duì)列中,再將當(dāng)前
運(yùn)算符入棧;當(dāng)讀入左括號(hào)時(shí),即入棧;當(dāng)讀到右括號(hào)時(shí),將挨近棧頂?shù)牡谝粋€(gè)左括號(hào)上
面的
運(yùn)算符全部挨次彈出,送至輸出隊(duì)列中,再刪除棧中的左括號(hào)。
通過(guò)返回值的大小代表優(yōu)先級(jí)的大小,其偽代碼算法如下:
switch(cp){
casef(f|lease*#*:O;h?k;
ca^*-f||ca^l/kxeek;
case*11ca^,八return2;teak;
)
4.1.2輸出隊(duì)列
之中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式之后,需要輸出后綴表達(dá)式,也就是當(dāng)前隊(duì)列,只需要
讓頭指針遍歷輸出數(shù)據(jù)即可。
其偽代碼如下:
x=Q->data[Q->front-H-];
4.2后綴表達(dá)式的求值
由于在將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式時(shí)已經(jīng)將運(yùn)算符安排在了合適的位置,在后綴表
達(dá)式中不僅不需要括號(hào),而且還徹底免除了運(yùn)算符優(yōu)先規(guī)則,僅需從左到右計(jì)算即可。
其偽代碼如下:
while(!QueueEnpty(Q)){
ch=DeQueue(Q)
if(ch>='0'&&ch<=g)
⑸dyU;)〃數(shù)字字符到數(shù)值的轉(zhuǎn)換
else{
y=Pop(S),x=Pop(S)
switch(ch){
11
case+:Pu^i(Szx+y);break;
case:Rash(S,xf);break;
case:Push(Szx*y);break;
ca^71:Pu±i(S,Wy);break;
)
}
4/11
5運(yùn)行與測(cè)試
5.1輸入表達(dá)式:
輸入一個(gè)中綴表達(dá)式:
5.2輸出結(jié)果:
輸出后綴表達(dá)式及其結(jié)果:
5/11
6總結(jié)和心得
6.1心得與問(wèn)題
在本次實(shí)驗(yàn)中,遇到的心得:
①為什么有判空隊(duì)列不需要判空棧?因?yàn)楫?dāng)S->top=-l時(shí)棧變?yōu)榭?,不需要單?dú)寫(xiě)一
個(gè)函數(shù)出來(lái)判斷。
②后綴表達(dá)式的求值中,Push(S,ch-,O,)中的ch-。是什么意思?因?yàn)檩斎氡磉_(dá)式時(shí)數(shù)
字是以字符的形式存儲(chǔ)的,當(dāng)進(jìn)行計(jì)算式需要字符到數(shù)值的轉(zhuǎn)換。
③中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式時(shí)為什么要用Push(S,W)將#壓入棧底?
④后綴表達(dá)式的求值中,SeqStackvs的作用是什么?為什么不用vs會(huì)出錯(cuò)?
⑤調(diào)用后綴表達(dá)式進(jìn)行計(jì)算時(shí),最終計(jì)算結(jié)果是放在棧中的,但為什么返回棧頂元素
時(shí)總是指向空?因?yàn)橹罢{(diào)用了Dequeue(Q),導(dǎo)致front發(fā)生了改變,相當(dāng)于隊(duì)列
被刪除了,所以再調(diào)用時(shí)就為空了,解決方法有多種,比如復(fù)制隊(duì)列,我采取了一
個(gè)簡(jiǎn)單的方法,在調(diào)用了CTPostExp(Q)后不忙著輸出后綴表達(dá)式,繼續(xù)調(diào)用
CPostExp(Q),在CPostExp(Q)中使用Dequeue(Q)時(shí)順便就將后綴表達(dá)式輸出,這樣
就避免了隊(duì)列第二次調(diào)用時(shí)已經(jīng)被刪除的窘境。
6.2總結(jié)
本次試驗(yàn)中內(nèi)存出錯(cuò)的情況比較多,比如在輸出后綴表達(dá)式時(shí)雖然結(jié)果正確,但后面還
有不少“燙燙…”,在計(jì)算后綴表達(dá)式時(shí),返回值總是沒(méi)有,等等,但通過(guò)不斷地調(diào)試這些
問(wèn)題都得以解決。
通過(guò)本次實(shí)驗(yàn),加強(qiáng)了對(duì)棧和隊(duì)列的存儲(chǔ)結(jié)構(gòu)的理解,特別是棧的先進(jìn)后出的結(jié)構(gòu)有了
更深的了解。
參考文獻(xiàn)
[1]蘇仕華等.數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).機(jī)械工業(yè)出版社.2005.05
[2]嚴(yán)蔚敏,吳偉明.數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版).清華大學(xué)出版社.2022
[3]譚浩強(qiáng).C程序設(shè)計(jì)(第三版).清華大學(xué)出版社.2005
附加程序代碼:
#include<stdio.h>
?defineStacksize100
#defineQueueSize100
typedefcharDataType;
typedefstruct
{
6/11
dhardata[100];
intfront,rear;
}SeqQueue;〃定義隊(duì)列類(lèi)型
typedefstruct
{
EataTypedata[100];
inttcp;
}SeqStack;〃棧類(lèi)型的定義
〃初始化隊(duì)列
voidInitQueue(Seqiieue*Q)
(
Q->front=0;
Q->rear=0;〃頭部和尾部份別賦值為0
}
〃清空隊(duì)列
intQueueEnpty(SeqQueue*Q)
(
returnQ->rear=Q->frcnt;〃隊(duì)列的頭指針等于尾指針
)
〃入隊(duì)列
voidEnQueue(SeqQueue*Q,DataTypex)
{
if((Q->rear+l)%QueueSize=Q->front)//判斷隊(duì)列是否裝滿(mǎn)
隊(duì)列溢出
else
(
Q->data[Q->rear]“
Q->rear=(Q->rear+l)%QueueSize;
)
)
〃輸出隊(duì)列
charDeQueue(SeqQueue*Q)
{
charx;
x=Q->data[Q->front];
Q->front++;
returnx;
}
//祕(mì)臺(tái)化棧
voidInitStack(Sec^tack*S)
(
S->tcp=-l;
}
7/11
〃入棧
voidPush(SeqStack*S,DataTypex)
{
if(S->tcp=StackSize-l)
棧溢出
else
(
S->tc^->tcp^l;//棧頂指針指向新插入的數(shù)據(jù)
S-X^ta[S->tcp]=x;
)
}
〃出棧
DataTypePop(SeqStack*S)
{
if(S->tcp=-l)
空棧
else
returnS->data[S->tcp-];
}
//取棧頂元素
DataTypeGetTop(SeqStack*S)
(
if(S->tcp=l)
???/p>
else
returnS-X^ta[S->tcp];
}
〃求運(yùn)算符優(yōu)先級(jí)函數(shù)
intPriority(EataTypeop)
(
switch(cp)
(
case1(*:
case:retum0;break;
ca^
ca^中l(wèi);br^k;
ca^
case'/〔return2;br^k;
)
)
//中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式
voidCTPostExp(Sec^ueue*Q)
SeqStackOS;〃運(yùn)算符棧
8/11
charczt;
SeqStack*S;
S=&OSf
InitStack(S);
R^(S,'#');〃壓入棧底元素#
do〃掃描中綴表達(dá)式
(
c=getchar();
switch(c)
{
曰k;〃去除空格符
ca^'01:
casefl*:
ca^*2*:
ca^,3,:
ca^⑷:
ca^r51:
ca^*6,:
ca^7:
ca^8:
ca^9:
EnQueue(Q,c);break;
case'(':RJ?I(S,C);break;
ca^
ca^
do
(
t=Psp(S);
if(t!=?(f
EnQueue(Q,t);
}vhile(t!=*(*&&S->tcpH);break;
case
ca^
ca^
ca^71:
vhile(Priority(c)<=Priority(fetTcp(S)))〃比較優(yōu)先級(jí)
{
t=Pop(S);
EnQueue(Qzt);
)
Push(S,c);
break;
}
}vbile(c!=,#');
9/11
〃后綴表達(dá)式的求值
intCPostExp(SeqQueue*Q)
(
SeqStackvs,*S;
charch;
intxzy;
S=&vs;〃有什么用
InitS
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年成都文理學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試備考題庫(kù)及答案詳細(xì)解析
- 2026第一季度廣東廣州市海珠區(qū)城市管理監(jiān)督檢查中心招聘環(huán)衛(wèi)工人65人考試重點(diǎn)試題及答案解析
- 2026年漳州職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試模擬試題含詳細(xì)答案解析
- 2026年上饒職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試備考試題含詳細(xì)答案解析
- 安徽公安職業(yè)學(xué)院《環(huán)境工程實(shí)驗(yàn)》2024 - 2025 學(xué)年第一學(xué)期期末試卷
- 深度解析(2026)《YBT 6260-2024 炭復(fù)合氧化亞硅》
- 2026年語(yǔ)言藝術(shù)與修辭運(yùn)用題庫(kù)及答案
- 2025年山東鋼鐵集團(tuán)有限公司社會(huì)招聘(13人)筆試參考題庫(kù)附帶答案詳解
- 2026年能源政策研究新能源開(kāi)發(fā)與節(jié)能減排試題
- 新材料在建筑行業(yè)的應(yīng)用前景
- DZ∕T 0130-2006 地質(zhì)礦產(chǎn)實(shí)驗(yàn)室測(cè)試質(zhì)量管理規(guī)范(正式版)
- 《研學(xué)旅行課程設(shè)計(jì)》課件-研學(xué)課程設(shè)計(jì)原則
- JJG 693-2011可燃?xì)怏w檢測(cè)報(bào)警器
- (本科)大學(xué)生勞動(dòng)教育理論與實(shí)踐教程全書(shū)電子教案完整版
- 黑龍江省中藥飲片炮制規(guī)范及標(biāo)準(zhǔn)
- 盤(pán)口暗語(yǔ)及盤(pán)口數(shù)字語(yǔ)言
- QC-提高衛(wèi)生間防水一次驗(yàn)收合格率
- 彈藥庫(kù)防火防爆消防演示
- 大地測(cè)量控制點(diǎn)坐標(biāo)轉(zhuǎn)換技術(shù)規(guī)程
- 食材配送服務(wù)方投標(biāo)方案(技術(shù)標(biāo))
- 食品安全全球標(biāo)準(zhǔn)BRCGS第9版內(nèi)部審核全套記錄
評(píng)論
0/150
提交評(píng)論