当前位置:文档之家› 算术表达式求值系统

算术表达式求值系统

算术表达式求值系统
算术表达式求值系统

数据结构课程设计报告

课设题目:算式表达式求值系统

班级: 软件1202

姓名:

学号:

指导教师: 李斌

成绩:

2013 年1月

目录

一、需求分析 (2)

二、概要设计 (2)

(一)设计思想 (2)

(二)实现方法 (2)

(三)模块整体设计图 (3)

(四)函数功能介绍 (3)

三、详细设计 (4)

(一)数据结构设计 (4)

(二)模块接口设计 (4)

(三)盒图 (5)

四、调试分析 (7)

五、用户手册 (7)

六、测试结果 (8)

七、附录 (9)

附录一设计体会 (9)

附录二源程序 (9)

一、需求分析

算式表达式求值是程序设计语言编译中一个最基本的问题。本次任务要求完成一个四则算式表达式求值系统。具体需求为:当用户输入一个四则算式(包括加、减、乘、除和括号),如(12+3)*2+9*4,输出其计算结果。具体要求如下:(一)要实现栈的基本操作算法,包括初始化栈、进栈、出栈等。

(二) 在本程序中,表达式中的元素限定为char型,表达式长度不超过100,表达式以“#”号为结束标志。

(三)要求程序输出表达式的计算结果。

二、概要设计

(一)设计思想

本次四则算式表达式求值的程序采用的是中缀表达式的求值的方法。所谓中缀表达式,就是指每个二目运算符在两个运算量的中间,假设所讨论的算术运算符包括:+ 、- 、*、/、%、^(乘方)和括号()。而本次程序的编写只涉及四则运算(+、-、*、/)和括号()。

设运算规则为:

.运算符的优先级为:()> *、/> +、- ;

.有括号出现时先算括号内的,后算括号外的,多层括号,由内向外进行;

表达式作为一个满足表达式语法规则的串存储,如表达式“3*2^(4+2*2-1*3)-5”,它的的求值过程为:自左向右扫描表达式,当扫描到3*2时不能马上计算,因为后面可能还有更高的运算,正确的处理过程是:需要两个栈:对象栈s1和算符栈s2。当自左至右扫描表达式的每一个字符时,若当前字符是运算对象,入对象栈,是运算符时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低则从对象栈出栈两个运算量,从算符栈出栈一个运算符进行运算,并将其运算结果入对象栈,继续处理当前字符,直到遇到结束符“#”。

根据运算规则,左括号“(”在栈外时它的级别最高,而进栈后它的级别则最低了; 乘方运算的结合性是自右向左,所以,它的栈外级别高于栈内; 就是说有的运算符栈内栈外的级别是不同的。当遇到右括号“)”时,一直需要对运算符栈出栈,并且做相应的运算,直到遇到栈顶为左括号“(”时,将其出栈,因此右括号“)”级别最低但它是不入栈的。对象栈初始化为空。根据以上分析,每个运算符栈内、栈外的级别如下:

算符栈内级别栈外级别

^ 3 4

*、/、% 2 2

+、- 1 1

( 0 4

) -1 -1

(二)实现方法

由于算符是字符类型,而表达式中的数字为数值类型,如果建立两个栈的结构的话,他们除了数据元素不同,其余操作都是类似的,这样不仅会增加程序的空间开销和执行时间,而且也使程序冗余度较大。我采用的解决方案是设置一个算符值x来表示算符,+、-、*、/、(、)的算符值依次为:1,2,3,4,5,6,用一个switch-case语句将算符转化为相应的数值,然后再入栈,这样就统一了对象栈和算符栈元素的数据类型。在将“(”出栈时,要避免将初值0数据多次入栈而导致出错,如2*(3-1)-1,正常情况下在遇到*时,就应该将数字2入对象栈,然后将保存算式中数值的变量a置零,但是当遇到“(”时,又要将数字0入栈,这样就会导致结果出错,所以在用户输入的数据入对象栈之前,应先判断是否为“(”,若为“(”,则不能将数据入对象栈;当遇到“)”时,“(”不能入栈,并且要将前面的“3”,“-”,“1”都依次出栈进行计算,在遇到“(”时,将“(”出栈,但接下来又会遇到“-”,因此又要将数字0入栈,这样也会导致结果出错因此,我用了一个z[Max]数组来存放“(”的算符值,在每次入对象栈之前,都需要判断在z[i-1]的值。

在解决了数据类型问题之后,程序的编写就显得容易多了。基本的操作包括栈的初始化、入栈、出栈、判空栈以及取栈顶元素,然后按照设计思路编写求四则表达式值的程序,此外还有一个界面程序,通过调用清屏函数system("cls")以及switch-case语句来实现界面的切换。

(三)模块整体设计图

(四)函数功能介绍

1.主函数void main()

功能:调用其他各个函数;

2.菜单函数 int menu()

功能:构造系统界面;

3.算式求值函数void suanshi()

功能:求解四则算式表达式之值

4.栈初始化函数SeqStack *Init_SeqStack()

功能:置空栈

5.入栈函数int Push_SeqStack (SeqStack *s, int x)

功能:将数据元素入栈

6.出栈函数int Pop_SeqStack(SeqStack *s, int *x)

功能:将数据元素出栈

7.取栈顶元素函数int Top_SeqStack(SeqStack *s)

功能:取出栈顶元素并将栈顶指针减一

8.判空栈函数int Empty_SeqStack(SeqStack *s)

功能:判断是否为空栈

三、详细设计

(一)数据结构设计

1.本系统采用结构体来定义栈,其结构如下:

typedef struct

{

int data[Max];

int top;

}SeqStack;

并且设置了两个栈s1,s2分别表示对象栈和算符栈。

2.定义了一个z[Max]数组用来存放出栈的“(”的算符值,以避免将数据初值0入栈而导致出错。

(二)模块接口设计:

1.各函数原型为:

void main() /*主函数*/

int menu() /*菜单函数*/

void suanshi() /*计算四则运算表达式*/ SeqStack *Init_SeqStack() /*栈初始化*/

int Push_SeqStack (SeqStack *s, int x) /*入栈*/

int Pop_SeqStack(SeqStack *s, int *x) /*出栈*/

int Top_SeqStack(SeqStack *s) /*取栈顶元素*/

int Empty_SeqStack(SeqStack *s) /*判断是否为空栈*/

2.系统界面切换的实现

利用清屏函数system("cls")实现屏幕切换,在从本界面返回上一界面时,根据提示输入即可,例如:

printf("是否继续查询,输入y或Y继续,输入其他键返回上一菜单\n");

scanf("%c",&choice);

if(choice=='y'||choice=='Y') suanshi();

则输入输入任意键都能返回上一界面,在main()函数中用for的无穷循环语句实现各函数的循环调用,以使各功能能够重复实现,直至用户退出系统为止。(三)盒图:

1.主函数盒图

图2 主函数盒图

2.菜单函数盒图

3.算术求值函数盒图

调用清屏函数system(“cls ”)

输出请输入一个带有括号的四则运算的算式以#结束:

输入一个四则运算表达式存入a1数组中 令p 指针指向a1数组,设置对象栈s1和算符栈s2

取第一个字符存入变量c 中 当c 不为空时 …0?=

否 a=a*10+c-'0'

‘#’ ‘

+’ ‘-’ ‘*’ ‘/’ …(? …)?

x=0;e2=-1;f=-1 x=1;e2=1;f=1

x=2;e2=1;f =1

x=3;e2=2;f=2

x=4;e2=2;f =2

x=5;e2=0;f =4

x=6;e2=-1;f=-1 x!=5&&z[i-1]==0

将a 入对象栈,a=0

i++

如果算符栈空或者栈外优先级高于栈外,则将算符入栈

否则将对象栈中出栈两个数据,算符栈出栈一个算符进行计算,直到栈内优先级高于栈外

将中间结果入对象栈 算符栈为空

跳出循环

将算符出栈,若为‘(’,且x=‘)’,则将其出栈,否则修改优先级

如果x!=6&&x!=0,则将x 入算符栈,并设置优先级

c=*p++

输出结果并输出是否继续查询,输入y 或Y 继续,输入其他键返回上一菜单 choice=输入字符,若choice==?y ?||?Y ?,则递归调用suanshi(),否则返回

4.入栈函数盒图

图5 入栈函数盒图

四、调试分析

在调试过程中我遇到的问题以及我的采取措施有:

(一)我先编写只含有加减的运算表达式,然后把乘除加进来,最后再把括号加进来。因为加减的优先级相同,所以一刚开始,我并没有用栈来做,而是用数组来做,我设置了一个整数类型的数组用来保存表达式中的数值,一个字符类型的数组用来保存算符,然后从左往右依次计算即可,因此,没有什么大问题。在将乘除加进来的时候,由于涉及到优先级的问题,因此,我不得不将对象数组和算符数组转换为对象栈和算符栈。当我把括号加进来的时候,就遇到了将初值0数据多次入栈而导致出错的现象,所以,我设置了一个z[Max]数组用来存放“(”出栈时的值,从而解决了问题。

(二)在接收用户输入的数据的时候,我用了整型数据来接收,这样在做除法运算的时候,就有可能会出现运算结果与预期结果不相符的情况,比如1/2,在本系统中运行的结果为0,但是我们预期的结果应该是0.5。但是如果将栈中的数据元素定义为实型,当将出栈的元素放入switch-case语句中时,系统又会报错。由于时间原因,我并没有对此做修改,还是将栈中的数据元素定义为整型,但是这样可能会导致在做除法运算的时候,出现结果不准确的情况,这也是本系统的一个漏洞。

(注:本系统的所有代码都是在windows环境下的Microsoft Visual C++ 6.0编译器中运行的。)

五、用户手册

(一)进入系统

双击算术表达式求值系统.cpp文件,按compile键(或Ctrl+F5)编译程序,再按BuildExecute键(或Ctrl+F5)运行程序,然后就进入了算术表达式求值系统;也可以直接在Debug中找到算术表达式求值系统.exe文件,然后双击它,

直接进入系统。

(二)求表达式之值

1.进入系统后,输入“1”,按回车,即进入算式表达式求值界面,若输入了除“1”和“2”以外的其他键,则会出现输入错误的提示信息,再按一次回车将重新回到菜单界面。

2.输入一个表达式以“#”为结束标志,要求输入的所有数据都为整数,且只能输入四则运算的算式,即算式中只含有+、-、*、/以及括号,如输入(12+3)*2+9*4#,按回车,即能得到结果。

3.如果想继续进行计算,则可以输入“y”或“Y”,然后重复步骤2,输入其他键将返回上一菜单。

(三)退出系统

当回到菜单界面时,输入“2”,将会出现退出系统的提示信息,然后按任意键退出算术表达式求值系统。

六、测试结果

(一)菜单界面

(二)求值界面

图7 求值界面截图

(三)报错界面

图8 报错界面截图

(四)退出界面

七、附录

附录一设计体会

本次课程设计难度不是很大,因为在平时做实验的时候有类似的题目,而且老师也有讲过中缀表达式的思想,只是要将其变成一个系统而已。本次程序设计的关键在于理解中缀表达式算法的基本思想,然后用栈的方法来解决问题。其中要考虑到“)”,“)”不能入栈,且“)”后面又是一个运算符,因此不能将此时存储数据元素的a=0入栈,否则会出现错误,还有要注意“(”何时出栈等问题。由于课程设计这一周我们有许多考试,所以时间有些紧迫,设计程序的时候有些仓促,因此本系统还存在一些不足之处以及可改进的地方。下面就本系统的特色及不足之处作简要说明:

(一)系统特色

1.采用菜单的方式工作,简洁明了,易于操作。

2.系统界面较为人性化,有提示输入的信息和错误提示,便于用户输入。

3.能够实现带括号的整数四则运算,并将结果显示在屏幕上。

(二)系统进一步扩充

1.界面美化程度还有待提高。

2.在进入每一个子界面后,只能逐级返回,而不能一下子退出系统。

3.只能计算整数类型的数据,而且在使用整型数据的时候,在做除法运算时,就有可能会出现运算结果与预期结果不相符的情况,比如1/2,在本系统中运行的结果为0,但是我们预期的结果应该是0.5,这样会给用户带来很大不便。

附录二源程序

#include

#include

#include

#define Max 100

typedef struct /*定义栈的结构*/

{

int data[Max];

int top;

}SeqStack;

SeqStack *Init_SeqStack() /*栈初始化*/

{

SeqStack *s;

s=(SeqStack *)malloc(sizeof(SeqStack));

s->top=-1;

return s;

}

int Empty_SeqStack(SeqStack *s) /*判断是否为空栈*/

{

if (s->top==-1) return 1;

else return 0;

}

int Push_SeqStack (SeqStack *s, int x)

{ /*入栈*/ if (s->top==Max-1) return 0; /*栈满不能入栈*/ else

{

s->top++;

s->data[s->top]=x;

return 1;

}

}

int Pop_SeqStack(SeqStack *s, int *x)

{ /*出栈*/ if (Empty_SeqStack ( s ) ) return 0; /*栈空不能出栈 */ else

{ *x=s->data[s->top];

s->top--; return 1; /*栈顶元素存入*x,返回*/ }

}

int Top_SeqStack(SeqStack *s)

{ /*取栈顶元素*/ if ( Empty_SeqStack (s) ) return 0; /*栈空*/

else return (s->data[s->top] );

}

void suanshi() /*计算四则运算表达式*/ {

system("cls"); /*清屏函数*/

char choice,a1[Max],*p;

printf("请输入一个带有括号的四则运算的算式以#结束:\n");

scanf("%s",a1);

SeqStack *s1,*s2;

p=a1;

char c=*p++;

int sum,result,a=0,b,d,e1=0,e2,f,x,y,z[Max]={0}, i=1;

s1=Init_SeqStack(); /*对象栈*/

s2=Init_SeqStack(); /*算符栈*/

while(c)

{

if(c>='0'&&c<='9') a=a*10+c-'0'; /*将字符串数字转化为数值*/ else

{

switch(c) /*将运算符数据化存入栈中并设栈内栈外优先级*/

{

case '#':x=0;e2=-1;f=-1;break;

case '+':x=1;e2=1;f=1;break;

case '-':x=2;e2=1;f=1;break;

case '*':x=3;e2=2;f=2;break;

case '/':x=4;e2=2;f=2;break;

case '(':x=5;e2=0;f=4;break;

case ')':x=6;e2=-1;f=-1;break;

}

if(x!=5&&z[i-1]==0) /*将数值入对象栈*/ {

Push_SeqStack(s1,a);

a=0;

}

i++;

if(Empty_SeqStack(s2)||e1

Push_SeqStack(s2,x);

e1=e2; /*修改优先级*/

}

else

{

while(e1>=f)

{

Pop_SeqStack(s2,&y); /*取出两个数据和一个运算符*/ Pop_SeqStack(s1,&b);

Pop_SeqStack(s1,&d);

switch(y) /*判断为何种运算符并做计算*/ {

case 1:sum=b+d;break;

case 2:sum=d-b;break;

case 3:sum=b*d;break;

case 4:sum=d/b;break;

case 5:Pop_SeqStack(s2,&z[i++]);break;

}

Push_SeqStack(s1,sum); /*中间结果入对象栈*/

if(Empty_SeqStack(s2)) break;

else

{

y=Top_SeqStack(s2);

if(x==6&&y==5) /*如果遇到“)”和“(”*/

{

Pop_SeqStack(s2,&z[i++]);

break;

}

else

{

switch(y) /*修改优先级*/

{

case 1:case 2:e2=1;break;

case 3:case 4:e2=2;break;

case 5:e2=0;break;

}

e1=e2;

}

}

}

if(x!=6&&x!=0) /*如果没有遇到“)”*/ {

Push_SeqStack(s2,x);

switch(x)

{

case 1:case 2:e2=1;f=1;break;

case 3:case 4:e2=2;f=2;break;

case 5:e2=0;f=4;break;

}

e1=e2;

}

}

}

c=*p++;

}

Pop_SeqStack(s1,&result); /*将最终结果出栈*/ printf("结果为:%d\n",result); /*在屏幕上显示最终结果*/

getchar();

printf("是否继续进行计算,输入y或Y继续,输入其他键返回上一菜单

\n");

scanf("%c",&choice);

if(choice=='y'||choice=='Y') suanshi();

}

int menu() /*菜单函数*/

{

system("cls");

int x;

printf("\n");

printf("************************* 欢迎进入算术表达式求值系统

*************************\n");

printf(" 1.算术表达式求值\n");

printf(" 2.退出系统\n");

printf("请输入您想选择的操作:(1-2)\n");

scanf("%d",&x);

return x;

}

void main() /*主函数*/

{

int c,i; /*变量c为用户的选择*/ for(i=0;;i++) /*变量i为循环次数*/

{

c=menu();

switch(c)

{

case 1:suanshi();break;

case 2:{

printf("********************************** 正在退出

**********************************\n");

printf("******************************** 欢迎下次使用

********************************\n");

exit(0);

}

default:{

printf("输入菜单号有误,请重新输入,按回车键结束!\n");

getchar();

getchar();

}

}

}

}

表达式求值算法实现

湖南人文科技学院计算机科学技术系 课程设计说明书 课程名称:数据结构 课程代码:408024 题目: 表达式求值 年级/专业/班:08级计算机科学与技术二班 学生姓名: 黄胜李业芝黄自强 黄沅涛姚洋 学号:08408210 08408211 08408212

08408213 08408215 指导教师: 袁辉勇 开题时间: 2009 年12 月21 日 完成时间: 2010 年 1 月 1 日

目录 摘要 (1) 一、引言 (3) 二、设计目的与任务 (3) 1、课程设计目的 (3) 2、课程设计的任务 (4) 三、设计方案 (4) 1、需求分析 (4) 2、概要设计 (4) 3、详细设计 (6) 4、程序清单 (13) 四、调试分析与体会 (17) 五、运行结果 (18) 六、结论 (20) 七、致谢 (21) 八、参考文献 (21)

摘要 在高级语言环境中算术表达上的结果是通过语言环境预设的算法的思想计算出来的,然而高级语言初学者并不了解表达式的计算过程和方法。本文采用算符优先分析和堆栈的方法给出了算术表达式的计算过程。 所以本次课程设计的程序是在Windows系统上为用户解决包括加、减、乘、除以及括号在内的四则混合运算。用户可通过键盘输入四则运算,经过程序运行之后,可以判断出用户所输入的表达式是否正确。如果正确,就给出表达式的值;如果不正确,就提示输入有误。 关键词:四则混合运算;高级语言;栈 Abstract The arithmetic expression result is the algorithm thought which supposes in advance through the language environment calculatesin the higher order language environment,however the higher order language beginner does not understand the expression the computationprocess and the method. This article used the operator first to analyze and the storehouse method has given the arithmetic expression computa-tion process. Therefore, the procedure in this curriculum design is the solution for users on Windows systems, including add, subtract, multiply, divide and brackets, including four hybrid operation. Users can enter via the keyboard 4 operation, after a program is running, you can determine the user entered expression is correct. If correct, it gives the value of the expression; if not correct, it prompted an error.

数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.doczj.com/doc/2f16210699.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)#

数据结构实验二——算术表达式求值实验报告

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.doczj.com/doc/2f16210699.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

数据结构课程设计_表达式求值问题

实验表达式求值问题 1.问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3.中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀表达式(如:11 22 7 4 - * 3 / +)和前缀表达式(+ 11 / * 22 - 7 4 3)。后缀表达式 和前缀表达式中没有括号,给计算带来方便。如后缀表达式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。 2.数据结构设计 (1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下: class SqStack { private: T *base; //栈底指针 int top; //栈顶 int stacksize; //栈容量public: SqStack(int m); //构建函数 ~SqStack(){delete [] base;top=0;stacksize=0;} //析构函数 void Push(T x); //入栈 T Pop(); //出栈 T GetTop(); //获取栈顶元素

int StackEmpty(); //测栈空 void ClearStack(); //清空栈 void StackTop(); //返回栈顶指针 void StackTranverse(); //显示栈中元素 }; (2)顺序栈类实现:对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。 Step1:申请一组连续的存空间为顺序栈使用: base=new T[m]; i f(base==NULL) { cout<<"栈创建失败,退出!"<

中缀表达式求值

江西理工大学软件学院计算机类课程实验报告 课程名称:数据结构 班级:11软件会计4班 姓名:黄健 学号:11222122 江西理工大学软件学院

一、目录(中缀表达式求值) 1、目录--------------------------------------------------------------2 2、实验目的--------------------------------------------------------3 3、实验要求--------------------------------------------------------3 4、实验仪器设备与材料-----------------------------------------3 5、实验原理--------------------------------------------------------4 6、实验步骤--------------------------------------------------------5 7、实验原始记录--------------------------------------------------6 8、实验数据分析计算结果--------------------------------------10 9、实验心得体会--------------------------------------------------11 10、思考题----------------------------------------------------------12

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈S 已存在。 操作结 果: 用P 返回S的栈顶元素。Push(&S 初始条 件:,ch) 栈S 已存在。 操作结 果:插入元素ch 为新的栈顶元素。 Pop(&S) 初始条件:栈S 已存在。 操作结 果:删除S 的栈顶元素。 In(ch) 操作结果:判断字符是否是运算符,运算符即返回1 Precede(c1, c2) 初始条件:c1,c2 为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b) 初始条件:a,b 为整数,op为运算符。操作结果: a 与 b 进行运算,op 为运算符,返回其值。num(n) 操作结果:返回操作数的长度。EvalExpr() 初始条件:输入表达式合法。操作结果:返回表达式的最终结果。}ADT Stack 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

后缀表达式求值的算法及代码

#include #include struct node // 栈结构声明 { int data; // 数据域 struct node *next; // 指针域 }; typedef struct node stacklist; // 链表类型 typedef stacklist *link; // 链表指针类型 link operand=NULL; // 操作数栈指针 link push(link stack,int value) // 进栈 { link newnode; // 新结点指针 newnode=new stacklist; // 分配新结点 if (!newnode) { printf("分配失败!"); return NULL; } newnode->data=value; // 创建结点的内容 newnode->next=stack; stack=newnode; // 新结点成为栈的开始return stack; } link pop(link stack,int *value) // 出栈 { link top; // 指向栈顶 if (stack !=NULL) { top=stack; // 指向栈顶 stack=stack->next; // 移动栈顶指针 *value=top->data; // 取数据 delete top; // 吸收结点 return stack; // 返回栈顶指针} else *value=-1; } int empty(link stack) // 判栈空 { if (stack!=NULL)

数据结构算术表达式求值实验报告

软件技术基础实验报告 实验名称:表达式计算器 系别:通信工程 年级: 班级: 学生学号: 学生姓名: 《数据结构》课程设计报告 题目简易计算表达式的演示 【题目要求】 要求:实现基本表达式计算的功能 输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值 基本操作:键入表达式,开始计算,计算过程和结果记录在文档中 难点:括号的处理、乘除的优先级高于加减

1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。 2.3 ADT 描述 ADT Stack{ 数据对象:D={ i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={< 1 ,-i i a a >| 1-i a ,D a i ∈,i=2,…,n}

基于二叉树结构的表达式求值算法

实验报告 课程名称: 程序设计与数据结构 指导老师: ljq 成绩: 实验名称:基于二叉树结构的表达式求值算法 实验类型: 上机 同组学生姓名: 一、实验目的和要求(必填) 三、代码缺陷及修正记录 五、讨论、心得 二、实验内容和代码(必填) 四、实验结果与分析(必填) 一、实验目的和要求 1. 掌握编程工具的使用 2. 掌握二叉树数据结构在计算机上的实现 3. 掌握通过计算机编程解决问题的基本方法 二、实验内容和代码 1.实验内容: ● 编程实现基于二叉树结构的表达式求值算法 ● 表达式包含加减乘除四则运算以及至少一层括弧运算 ● 首先将输入的原表达式转换成二叉树结构,然后采用二叉树的后序递归遍历 方法求得表达式的值 ● 将所有实验内容合并到一个工程,增加交互操作和循环处理(持续) 2.代码 1.头文件expnbitree .h

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include #include #include #define EXP_LEN 100 //定义表达式的最大长度 #define DATA_LEN 20 //定义每个操作数的最大长度 typedef struct BiTNode { int dflag; //标志域,值为1,data[]存放操作运算符;值为0,data[]存放操作数char data[DATA_LEN + 1]; //数据域,存放:操作运算符或操作数 struct BiTNode *lchild, *rchild; //分别指向结点的左、右子树 }BiTNode, *BiTree; //定义二叉树结点及二叉树类型指针 int CreateBiTree(BiTree &bt, char *p, int len); //创建二叉树,并用bt返回树的根地址,p为表达式的首地址,l为表达式的长度 int Calculate(BiTree bt, double &rst); //计算表达式的值,bt为据表达式创建的二叉树,用rst返回表达式的值 int PreOrderTraverse(BiTree bt);//先序遍历二叉树bt,输出先序遍历序列 int InOrderTraverse(BiTree bt); //中序遍历二叉树bt,输出中序遍历序列 int PostOrderTraverse(BiTree bt); //后序遍历二叉树bt,输出后序遍历序列 int DestroyBiTree(BiTree &bt); //销毁二叉树 //二叉树结构的表达式求解算法入口

表达式求值课程设计报告

表达式求值课程设计报告 表达式求值 《数据结构》 课程设计报告 题目: 栈的应用:表达式求值 (系): 信息科学与工程学院院 专业班级: 软件工程1102班学生姓名: 学号: 指导教师: 20 13 年 6 月 8 日至20 13 年 6 月 21 日 表达式求值 目录 目录 (2) 1 概述 (1) 1.1 课程设计目的 (1) 1.2 课程设计内容 (1) 2 系统需求分析 ...................................................... 1 2.1 系统目标 (1) 2.2 主体功能 (1) 2.3 开发环境 (1) 3 系统概要设计 .................................................... 2 3.1 系统的功能模块划分 (2)

3.2 系统流程图 (2) 4系统详细设计 ..................................................... 3 5 测试 ............................................................ 6 5.1 测试方案 (6) 5.2 测试结果 (6) 6 小结 ............................................................ 8 参考文献 .......................................................... 9 附录1 源程序清单 (10) 2 数据结构课程设计报告(2012) 表达式求值 1 概述 1.1 课程设计目的 1(要求学生达到熟练掌握C语言的基本知识和技能。 2(了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。 3(提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 4(培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提 高程序设计水平。

数据结构课程设计报告-中缀算术表达式求值

课程设计报告 课程名称数据结构 课题名称中缀算术表达式求值 专业通信工程 班级通信0902 学号 姓名 指导教师 2011 年07 月01 日

湖南工程学院 课程设计任务书 课程名称数据结构 课题中缀算术表达式求值 专业班级通信工程0902 学生姓名 学号 指导老师 审批 任务书下达日期2011 年06 月27日 任务完成日期2011 年07 月01日

设计要求: 1. 课程设计报告规范 (1)需求分析 a.程序的功能。 b.输入输出的要求。 (2)概要设计 a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系; 每个模块的功能。 b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是 什么样的结构,它们之间有什么关系等。 (3)详细设计 a.采用C语言定义相关的数据类型。 b.写出各模块的类C码算法。 c.画出各函数的调用关系图、主要函数的流程图。 (4)调试分析以及设计体会 a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输 出结果和含有错误的输入及输出结果。 b.程序调试中遇到的问题以及解决问题的方法。 c.课程设计过程经验教训、心得体会。 (5)使用说明 用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步 骤。 (6)书写格式 a.设计报告要求用A4纸打印成册: b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行 距为22。 (7)附录 源程序清单(带注释)

2. 考核方式 指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:(1)平时出勤(占10%) (2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%) (3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)(4)设计报告(占30%) 注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。 (5)独立完成情况(占10%)。 3 . 课程验收 (1)运行所设计的系统。 (2)回答有关问题。 (3)提交课程设计报告。 (4)提交软盘(源程序、设计报告文档)。 (5)依内容的创新程度,完善程序情况及对程序讲解情况打分。 2 进度安排 第19 周:星期一8:00——12:00 上课 星期一14:30——18:30 上机 星期二14:30——18:30 上机 星期四8:00——12:00 上机 附: 课程设计报告装订顺序:封面、任务书、目录、正文、评分表、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。 正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现

数据结构课程设计算术表达式求值计算器.doc

高级语言程序设计 《算术表达式求值》 课程设计报告

算术表达式求值 系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。 第二章系统分析 开始运行时界面如下: 你可以输入一个表达式,按E对其进行求值。

第四章系统实现 #include #include #include #include #define N 100 double numStack[N]={0};//操作数栈 int numTop; char opStack[N];//运算符栈 int opTop; void print_num(double str1[],int n) { int i; printf("\n操作数栈:\n"); for(i=0;i

if(ch=='+'||ch=='-') return 2; if(ch=='*'||ch=='/') return 3; if(ch=='(') return -1; return 0; } double result(double num1,char op,double num2)//计算 { if(op=='+') return num1+num2; if(op=='-') return num1-num2; if(op=='*') return num1*num2; if(op=='/') return num1/num2; return 0; } int compute(char str[]) { double num=0; int i=0,j=1,k=1; numTop=opTop=0; while(str[i]!='\0'||opTop>0) { if(str[i]>='0'&&str[i]<='9') num=num*10+str[i]-'0'; else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) ) k=-1; else { if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')')

算术表达式求值课程设计报告

课程设计 教学院 课程名称 题目 专业 班级 姓名 同组人员 指导教师 2013 年 6 月22 日 (完成时间)

目录 一.概述 (2) 二.总体方案设计 (4) 三.详细设计 (6) 四.程序的调试与运行结果说明 (14) 五.课程设计总结 (14) 六.附录 (16) 参考文献 (3233) (“目录”要求必须自动生成)

一概述(宋体,三号,加粗,居中) 1.课程设计的目的(小标题,宋体,四号,加粗,左对齐顶格) (1).理解和掌握该课程中的有关基本概念,程序设计思想和方法。 (2).培养综合运用所学知识独立完成课题的能力。 (3).培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 (4).掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 2.课程设计的要求 算术表达式求值程序实现以下功能: (1)构造一个空栈S,初始条件:栈S已存在 (2)用P返回S的栈顶元素 (3)插入元素ch为新的栈顶元素 (4)删除S的栈顶元素 (5)判断字符是否是运算符,运算符即返回1 (6)判断运算符优先权,返回优先权高的 (7)输入表达式 (8)返回表达式的最终结果。

二总体方案设计 a)需求分析 该程序能实现算术四则运算表达式的求值,显示运算过程。 输入的形式:表达式,例如5*(3+7)#。 包含的运算符只能有'+'、 '-'、'*'、 '/'、 ' (' ') '; 程序所能达到的功能:对表达式求值并输出。 b)总体设计 本程序使用的是编程工具是Visual c++ 6.0,实现了运算器的功能和仿真界面(大体界面如下图所示)。在基本要求的基础上,运算数可以是实数类型,同时增加了乘方运算的功能;可以实现对负数的运算,例如用户输入表达式6* (-0.25),则程序会在负号的前面自动加上一个0。 1)算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^);另一个称作 OPND,用以寄存操作数和运算结果,操作数可以是float型的浮点数。 算法的基本思想是: 2)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; 依次读入表达式中的每个字符,若是操作数(浮点数)则进OPND栈, 若是运算符(+、—、*、/、^)则和OPTR栈的栈顶运算符比较优先权 后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当 前读入的字符均为“#”)。 3)编写一个原型为void strtofloat(char str[ ],int n,int i),把一 个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码 见附录,并有具体解释)

c语言中缀后缀算术表达式求值用栈实现

c语言中缀、后缀算术表达式求值用栈实现 #include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #define MaxSize 50 typedef struct { float data[MaxSize]; int top; }OpStack; typedef struct { char data[MaxSize]; int top; }SeqStack; void InitStack(SeqStack *S);//初始化栈 int StackEmpty(SeqStack S);//判断栈是否为空 int PushStack(SeqStack *S,char e);//进栈 int PopStack(SeqStack *S,char *e);//删除栈顶元素 int GetTop(SeqStack S,char *e);//取栈顶元素 void TranslateExpress(char s1[],char s2[]);//将中缀表达式转化为后缀表达式float ComputeExpress(char s[]);//计算后缀表达式的值 void main() { char a[MaxSize],b[MaxSize]; float f; printf("请输入一个算术表达式:\n"); gets(a); printf("中缀表达式为:%s\n",a); TranslateExpress(a,b); printf("后缀表达式为:%s\n",b); f=ComputeExpress(b); printf("计算结果:%f\n",f); } void InitStack(SeqStack *S)//初始化栈

四则运算表达式求值(栈+二叉树,c++版)

HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名:周华毅 学生学号:201308010411 专业班级:计科1304 指导老师:吴帆 完成日期:2015/5/1

一、需求分析 a)四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达 式,并计算结果。 b)本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结 果来求解后缀表达式的值。 c)在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么 在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔 开;如果不正确,在字符界面上输出表达式错误提示。 d)测试数据 输入: 21+23*(12-6) 输出: 21 23 12 6 -*+ 二、概要设计 抽象数据类型 为实现上述程序的功能,应以字符串存储用户的输入,以及计算出的结果。 算法的基本思想 根据题目要求,利用二叉树后序遍历来实现表达式的转换。该算法的基本模块包括二叉树的建立以及如何把输入的中缀表达式利用二叉树后序遍历转化为后缀表达式。 1、首先要将输入的中缀表达式(数字字符)存入到二叉树中,由于存在两位或者两位以上的数,甚至还有小数,所以考虑用字符型指针存储数字字符和操作符。 2、为了便于将中缀表达式存入二叉树中,在录入中缀表达式后,要进行相应的处理,比如去掉空格符,添加结束标志,如‘=’、‘#’等。 3、中缀表达式存入到二叉树的过程中,要注意处理的顺序,如‘+’、‘-’号的优先级比‘*’、‘/’号的低,当遇到‘*’、‘/’号时,要判断树以上的节点中是否有‘+’、‘-’号,有的话要与其交换位置。遇到‘(’时要反复创建二叉树的结点,构建子二叉树,考虑到括号内要处理的步骤可能会较多,可以考虑用递归。遇到‘)’时则直接结束此子二叉树的建立。此外二叉树中叶子结点存储操作数,非叶子结点存储操作码。 4、对创建好的二叉树进行后序遍历,即可得到相应的后缀表达式,实现方法可以用递归的方式,由于后面还要计算表达式的值,故便利的过程中要将结点中得到的数据存入新的字符数组中。 程序的流程 程序由三个模块组成: (1)输入模块:完成一个中缀表达式的输入,存入字符串数组array[Max]中。 (2)计算模块:设计一个建立二叉树的函数,Node* crtTree(Node* root),传入根结点指针,返回根结点指针,该函数的实现还要反复使用另一个函数char getOp(Node *temp),其将数字字符存入一个结点,并返回数字字符的后一 个符号。void deal()函数功能是对字符数组进行处理。void output(Node *root); 函数功能是获得处理后的字符串,也就是中缀表达式转化为的后 缀表达式。 (3)输出模块:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式和表达式的值;如果不正确,在字符界面上输出表达式错误提示。 三、详细设计

算术表达式求值课设报告

数据结构课程设计 设计说明书表达式求值算法的实现((()()(( 学生姓名 学号 班级 成绩 指导教师 数学与计算机科学学院 2012年 9月 7日

数据结构课程设计评阅书

课程设计任务书 2011—2012学年第2学期 专业学号:姓名: 课程设计名称:数据结构课程设计 设计题目:表达式求值算法的实现 完成期限:自 2012 年 8 月 28 日至 2012 年 9 月 7 日共 2 周 栈的存储和相关运算是数据结构中数组部分的重点知识和技能。表达式求值算法可借助栈来完成,它的存储可以使用顺序结构也可以使用链式结构,这要根据具体的应用来决定。本课程设计按以下的要求运用C/ C++结构体、指针、数据结构等基知识编程实现。 任务要求:1)阐述设计思想,画出流程图;2)任意输入一个表达式(算术、逻辑、关系表达式);3)建立栈;4)借助栈的相关运算完成表达式求值过程;5)将表达式及其运算结果按照其数学形式打印输出; 6)说明测试方法,写出完整的运行结果,较好的界面设计;7)按照格式要求完成课程设计说明书。设计要求: 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?确定问题的输入数据集合。 2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架; 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚; 5)程序调试与测试:能够熟练掌握调试工具的各种功能,设计测试数据确保程序正确。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析; 7)编写课程设计报告; 指导教师(签字):教研室主任(签字): 批准日期:年月日

数据结构教学规划表达式求值【完全版】

XXXXXX大学《数据结构》课程设计报告 班级: 学号: 姓名: 指导老师:

目录 一算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 二感想体会与总结

算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台 Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈

{ char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; } int Push(SqStack &s,char e) //运算符入栈 { if (s.top-s.base >= s.stacksize) { printf("运算符栈满!\n");

《大数据结构》算术表达式求值

实用标准文档 二课程设计2——算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 三感想体会与总结 算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台

Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; }

相关主题
文本预览
相关文档 最新文档