利用棧求表達(dá)式的值_第1頁
利用棧求表達(dá)式的值_第2頁
利用棧求表達(dá)式的值_第3頁
利用棧求表達(dá)式的值_第4頁
利用棧求表達(dá)式的值_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論