




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、題目:利用棧求表達(dá)式的值一設(shè)計任務(wù)和目標(biāo)編寫程序?qū)崿F(xiàn)表達(dá)式求值,即驗證某算術(shù)表達(dá)式的正確性,若正確,則計算該算術(shù)表達(dá)式的值。主要功能描述如下:1、從鍵盤上輸入表達(dá)式。2、分析該表達(dá)式是否合法:(1)是數(shù)字,則判斷該數(shù)字的合法性。若合法,則壓入數(shù)據(jù)到堆棧中。(2)是規(guī)定的運算符,則根據(jù)規(guī)則進(jìn)行處理。在處理過程中,將計算該表達(dá)式的值。(3)若是其它字符,則返回錯誤信息。 主要功能描述如下:1、從鍵盤上輸入表達(dá)式。2、分析該表達(dá)式是否合法:(1)是數(shù)字,則判斷該數(shù)字的合法性。若合法,則壓入數(shù)據(jù)到堆棧中。(2)是規(guī)定的運算符,則根據(jù)規(guī)則進(jìn)行處理。在處理過程中,將計算該表達(dá)式的值。(3)若是其它字符,則
2、返回錯誤信息。程序應(yīng)包括以下幾個功能函數(shù)void initstack();初始化堆棧int Make_str();語法檢查并計算int push_operate(int operate):將操作碼壓入堆棧int push_num(double num):將操作數(shù)壓入堆棧int procede(int operate):處理操作碼 int change_opnd(int operate):將字符型操作碼轉(zhuǎn)換成優(yōu)先級int push_opnd(int operate):將操作碼壓入堆棧int pop_opnd();將操作碼彈出堆棧int caculate(interru_opnd):簡單計算 +,
3、-,*,/double pop_num():彈出操作數(shù)程序如下:#include "stdio.h"#include "string.h"#include "stdlib.h"#define MAXLEN 100typedef struct char op; int level;opt;typedef struct /定義操作符棧 opt stMAXLEN; int top;op_stack;typedef struct /定義值棧 double DMAXLEN; int top;D_stack;/-對棧操作的定義-opt peek(
4、op_stack *s) /定義看棧頂函數(shù) opt error=; if(s->top>=0) return s->sts->top; else return error;int IsEmpty(op_stack *s) /定義判斷??盏暮瘮?shù) if(s->top<0) return 0; else return s->sts->top.op;char push(op_stack *s,opt c) /定義入棧函數(shù) s->top+; s->sts->top=c; return c.op;opt pop(op_stack *s) /
5、定義出棧函數(shù) opt i; opt error=; if(s->top>=0) i=s->sts->top; s->sts->top.op='0' s->top-; return i; else return error;void clear(op_stack *s) /定義初始化棧 s->top=-1;/-define the value stack-double Dpeek(D_stack *s) /定義看棧頂函數(shù) if(s->top>=0) return s->Ds->top; else return
6、 0;int DIsEmpty(D_stack *s) /定義判斷??盏暮瘮?shù) if(s->top<0) return 0; else return (int)(s->Ds->top);double Dpush(D_stack *s,double c) /定義入棧函數(shù) s->top+; s->Ds->top=c; return c;double Dpop(D_stack *s) /定義出棧函數(shù) double i; if(s->top>=0) i=s->Ds->top; s->Ds->top='0' s-
7、>top-; return i; else return 0;void Dclear(D_stack *s) /定義初始化棧 s->top=-1;double calval(char *exp) op_stack os; /定義兩個棧 D_stack ds; char tmpMAXLEN=; int i=0,leng; double dtmp,dpoptmp; opt A=; opt R=; opt M=; opt D=; opt B=; opt Mo=; clear(&os); Dclear(&ds); /-定義初始化結(jié)束- while(*exp!='0&
8、#39;) while(*exp >= '0' && *exp <= '9' | *exp = '.') while(*exp >= '0' && *exp <= '9' | *exp = '.') tmpi+=*exp+; dtmp=atof(tmp); Dpush(&ds,dtmp); leng=strlen(tmp); for(i=0;i<leng;i+) tmpi='0' i=0; /- switch(*e
9、xp) case '+' : if(!IsEmpty(&os) | peek(&os).level < A.level) push(&os,A); *exp+; else while(IsEmpty(&os) && peek(&os).level>=A.level) switch(pop(&os).op) case '%': dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&
10、;ds,dpoptmp); break; case '*' : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case '/' : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case '+': dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; ca
11、se '-': dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,A); *exp+; break; case '-': if(!IsEmpty(&os) | peek(&os).level < R.level) push(&os,R); *exp+; else while(IsEmpty(&os) && peek(&os).level>=R.leve
12、l) switch(pop(&os).op) case '%' : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case '*' : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case '/' : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/
13、dpoptmp; Dpush(&ds,dpoptmp); break; case '+': dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case '-': dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,R); *exp+; break; case '*': if(!IsEmpty(&os) |
14、 peek(&os).level < M.level) push(&os,M); *exp+; else while(IsEmpty(&os) && peek(&os).level>=M.level) switch(pop(&os).op) case '%' : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case '*' : dpop
15、tmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case '/' : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,M); *exp+; break; case '/': if(!IsEmpty(&os) | peek(&os).level < D.level) push(&os,D); *exp+; el
16、se while(IsEmpty(&os) && peek(&os).level>=D.level) switch(pop(&os).op) case '%' : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case '*' : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); brea
17、k; case '/' : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,D); *exp+; break; case '%': if(!IsEmpty(&os) | peek(&os).level < Mo.level) push(&os,Mo); *exp+; else while(IsEmpty(&os) && peek(&os).level>
18、;=Mo.level) switch(pop(&os).op) case '%' : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case '*' : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case '/' : dpoptmp=Dpop(&ds); dpoptmp=Dpop(
19、&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,Mo); *exp+; break; case '(': push(&os,B); exp+; break; case ')': while(peek(&os).level!=-2) switch(pop(&os).op) case '%' : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&
20、amp;ds,dpoptmp); break; case '*' : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case '/' : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case '+': dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case '-': dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; pop(&os); /彈出 ( exp+; break; while(IsEmpty(&a
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 正規(guī)服裝合作合同范本
- 五金電器購銷合同范本
- 米線店加盟合同范本
- 合同范本委托
- 醫(yī)療公司勞務(wù)合同范本
- 古玩字畫買賣合同范本
- 公司做飯阿姨勞務(wù)合同范本
- 公司委托租房合同范本
- 合肥 裝修 合同范本
- 廠房和設(shè)備采購合同范本
- 汕頭市基層診所醫(yī)療機構(gòu)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心村衛(wèi)生室地址信息
- 2021年山東能源集團西北礦業(yè)有限公司招聘筆試試題及答案解析
- 售后服務(wù)流程圖
- 建筑地基處理技術(shù)規(guī)范JGJ79-2012
- 印象主義、后印象主義課件
- 日常監(jiān)督檢查表
- 隊列訓(xùn)練教程ppt課件(PPT 86頁)
- 第三章-農(nóng)村公共管理組織課件
- 注塑員工培訓(xùn)
- JMP操作簡要培訓(xùn)
- 勝利油田壓驅(qū)技術(shù)工藝研究進(jìn)展及下步工作方向
評論
0/150
提交評論