




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗四:通過棧設計一個計算器程序學 院 理學院 專 業 空間信息與數字技術 班 級 空數131 學 號 1307010160、1307010177、1307010179、1307010182 姓 名 吳廷友、佘艷云、周志妹、晏子先 實驗時間: 2015年11月5日 一、 實驗目的:1.熟悉棧的表示和實現方法,基于相應的表示實現;2.基于棧的各種操作,做一個簡單的計算機軟件。3.掌握棧各種操作,并能進行迷宮求解;二、 實驗環境:軟件環境:Windows XP,VC +;硬件環境:XXX計算機;三、 實驗要求與提示:要求:1. 實現棧的初始化、入棧和出棧等基本操作。2. 基
2、于棧的各種操作,以及棧的表示和存儲,設計一個簡單的計算器應用程序。該程序能夠實現計算一個表達式的值,例如能夠計算類似于2.5+(3.1-1.3)*6這一類的表達式的值。最后要求使用圖形化界面程序,將計算器應用程序打包成一個.exe文件。提示:基于棧的操作,計算表達式的值的算法思想: 1.對棧進行初始化操作;2.分別將表達式的值和符號放入兩個棧,通過四則運算的優先級進行算法設計。即:若一個表達式為2.5+3.2*1.4,將數值和符號分別同時入棧,當遇到乘法時,就將棧頂元素以及棧頂元素的上一個元素進行出棧操作,然后將計算結果再入棧。圖形化界面程序需要利用C+來實現,VC6.0中的MFC就是用來開發
3、圖形化界面的。四、 算法設計及源碼分析#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 10#define STACKINCREMENT 10char op7='+','-','*','/','(',')','n'/運算符集合typedef struct /定義操作符結構體int *base;int *top;int stacksize;SqStack;typedef struct /定義操作
4、數結構體double *base;double *top;int stacksize;DoubleStack;void InitStack(SqStack *s)/構造一個裝操作符的空棧s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int);s->top=s->base;s->stacksize=STACK_INIT_SIZE;void InitDoubleStack(DoubleStack *s)/構造一個裝操作數的空棧s->base=(double *)malloc(STACK_INIT_SIZE*sizeof(do
5、uble);s->top=s->base;s->stacksize=STACK_INIT_SIZE;char GetTop(SqStack *s) /返回線頂元素if(s->top=s->base)printf("棧為空!");return;return *(s->top-1);double GetTopDouble(DoubleStack *s)if(s->top=s->base)printf("棧為空!");return 0;return *(s->top-1);void Push(SqStack
6、 *s,int e)/操作符的入棧的函數if(s->top-s->base>=s->stacksize)s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int);s->top=s->base+s->stacksize;s->stacksize+=STACKINCREMENT;*(s->top)=e;s->top+;void PushDouble(DoubleStack *s,double e)/操作數的入棧的函數if(s->
7、top-s->base>=s->stacksize)s->base=(double *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(double);s->top=s->base+s->stacksize;s->stacksize+=STACKINCREMENT;*(s->top)=e;s->top+;void Pop(SqStack *s,int *e)/操作符的出棧的函數if(s->top=s->base)printf("棧為空!&quo
8、t;);return;s->top-;*e=*(s->top);void PopDouble(DoubleStack *s,double *e)/操作數的出棧的函數if(s->top=s->base)printf("棧為空!");return;s->top-;*e=*(s->top);int In(char c)/判斷是否是運算符,如果是反回1,不是則返回0;int i;for(i=0;i<8;i+)if(c=opi)return 1;return 0;char Precede(char charGetTop,char c)/判斷運
9、算符的優先級switch (charGetTop)case '+':switch (c)case '+':return '>'case '-':return '>'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '>'case 'n':ret
10、urn '>'break;case '-':switch (c)case '+':return '>'case '-':return '>'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '>'case 'n':retu
11、rn '>'break;case '*':switch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case '(':return '<'case ')':return '>'case 'n':retur
12、n '>'break;case '/':switch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case '(':return '<'case ')':return '>'case 'n':return
13、 '>'break;case '(':switch (c)case '+':return '<'case '-':return '<'case '*':return '<'case '/':return '<'case '(':return '<'case ')':return '='break;case ')':swit
14、ch (c)case '+':return '>'case '-':return '>'case '*':return '>'case '/':return '>'case ')':return '>'case 'n':return '>'break;case 'n':switch (c)case '+':return '<
15、'case '-':return '<'case '*':return '<'case '/':return '<'case '(':return '<'case 'n':return '='break;double Operate(double a,char theta,double b)switch(theta)case '+':return (a+b);case '-'
16、;:return (a-b);case '*':return (a*b);case '/':return (a/b);void main()SqStack optr,temp;DoubleStack opnd;char c;char x,theta;int n,y=0,i;double m=0,a,b;InitStack(&optr);Push(&optr,'n');/初始化運算符棧InitDoubleStack(&opnd);InitStack(&temp);c=getchar();while(GetTop(&a
17、mp;optr)!='n'|c!='n')if(!In(c)Push(&temp,(c-'0');c=getchar();elseif(temp.top!=temp.base)y=0;m=0;while(temp.top!=temp.base)Pop(&temp,&n);for(i=0;i<y;i+)n=n*10;m+=n;y+;PushDouble(&opnd,m);switch(Precede(GetTop(&optr),c)case '<':Push(&optr,c
18、);c=getchar();break;case '=':Pop(&optr,&x);c=getchar();break;case '>':Pop(&optr,&theta);PopDouble(&opnd,&b);PopDouble(&opnd,&a);PushDouble(&opnd,Operate(a,theta,b);break;printf("%fn",GetTopDouble(&opnd);getchar();五、 實驗結果:隨便輸入一個表達式然后得到運行結果如下六、 實驗收獲:本實驗以C語言的棧的相關知識為基礎,通過控制兩個棧(運算數棧和運算符棧)的進出的棧操作,來實現對包含加、減、乘、除、括號運算符任意整型表達式的求解運算。從程序的編寫來看,感覺這次我們真的學到了好多,特別是對程序的開發流程。從最初的選定程序,到最終的程序運行成功,讓我們感到如果是僅僅掌握課本上的知識是遠遠不能夠很好的應用到實際的編程中去的。在這個過程中還
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體校課題申報書
- 微生物檢驗的未來技術展望試題及答案
- 2025年銀行從業資格證考試爭創佳績試題與答案
- 微生物檢測實驗室的職能與管理及試題及答案
- 項目資源管理的常見考題試題及答案
- 山東省臨沂第十九中學2024-2025學年高考語文三模試卷含解析
- 揭秘2025年證券從業資格證試題及答案
- 注冊會計師備考有效時間利用法則試題及答案
- 項目價值鏈分析的試題及答案
- 經典真題分析與解答試題及答案
- 土地管理法實施條例考試試題
- 真實的PBL真實的挑戰:項目式學習設計指南
- 水果批發市場項目商業計劃書
- 前庭大腺囊腫護理查房課件
- 十四五國家臨床專科能力建設規
- 高考數學刷題:全國一模套卷(12套含答案)
- 綠化人員缺崗應急預案
- JGJ366-2015 混凝土結構成型鋼筋應用技術規程
- 土木工程材料試題(5套)
- 井下停送電安全工作規程
- 水利工程污水管道施工監理實施細則
評論
0/150
提交評論