数据结构算术表达式的求解本科学位论文.docx

上传人:b****5 文档编号:4109851 上传时间:2022-11-27 格式:DOCX 页数:14 大小:68.94KB
下载 相关 举报
数据结构算术表达式的求解本科学位论文.docx_第1页
第1页 / 共14页
数据结构算术表达式的求解本科学位论文.docx_第2页
第2页 / 共14页
数据结构算术表达式的求解本科学位论文.docx_第3页
第3页 / 共14页
数据结构算术表达式的求解本科学位论文.docx_第4页
第4页 / 共14页
数据结构算术表达式的求解本科学位论文.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构算术表达式的求解本科学位论文.docx

《数据结构算术表达式的求解本科学位论文.docx》由会员分享,可在线阅读,更多相关《数据结构算术表达式的求解本科学位论文.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构算术表达式的求解本科学位论文.docx

数据结构算术表达式的求解本科学位论文

 

滨江学院

数据结构课程设计

题目算术表达式的求解

院系计算机系

专业

学生姓名

学号

指导教师李燕

二O一六年六月十日

 

目录

1.前言1

1.1课题内容及要求1

1.2选题目的及意义1

2.系统分析2

2.1问题描述2

2.2运算符的优先级分析:

2

2.3错误提示分析:

2

3.系统概要设计3

3.1系统总体架构设计3

3.2系统模块的设计3

4.系统详细设计4

4.1数据的存储设计与描述:

4

4.2详细的优先级关系:

4

4.3具体的操作集合:

4

5.程序实现6

6.程序测试13

6.1正确的结果13

6.2错误113

6.3错误213

6.4错误313

7.收获及体会:

15

参考文献:

15

1.前言

1.1课题内容及要求

题目39:

算术表达式的求解

问题描述:

给定一个算术表达式,通过程序求出最后的结果。

基本要求:

从键盘输入要求解的算术表达式;

采用栈结构进行算术表达式的求解过程;

能够判断算术表达式正确与否;

对于错误表达式给出提示;

对于正确的表达式给出最后的结果;

1.2选题目的及意义

⑴进一步熟悉和使用栈的基本操作,如栈的初始化,进栈,出栈的特性。

⑵学习在实际生活中使用栈来解决问题。

 

2.系统分析

2.1问题描述

要正确计算表达式的值,必须要正确的解释表达式。

首先解释算术表达式的运算规则,分为以下三点:

⑴先乘除后加减;

⑵从左往右进行计算;

⑶有括号的,先算括号内的;

2.2运算符的优先级分析:

任何一个表达式都是由运算符,操作数和界限符组成的。

这里把运算符,界限符统称为算符。

设两个操作符分别为op1和op2。

为实现运算符的优先法则,优先关系会出现三种情况,op1的优先级高于op2的优先级,op1的优先级等于op2的优先级,op1的优先级小于op2的优先级。

2.3错误提示分析:

对于输入错误的,比如出现了表达式以外的非法字符,没有按照正确格式进行输入。

系统会给出提示。

 

 

3.系统概要设计

3.1系统总体架构设计

3.2系统模块的设计

为了更好的服务,结合用户的需求,有如下的模块设计:

程序主要包括三个模块:

⑴主函数设计模块

intmain(){

函数体

}

⑵栈模块:

一些本程序需要的操作,如初始化栈,定义栈,出栈,入栈,取栈顶元素。

⑶运算模块:

对一些优先级的定义,以及基本的算术运算。

4.系统详细设计

4.1数据的存储设计与描述:

为实现运算符的优先算法,可以用两个栈:

运算符栈OPTR,操作数栈OPND。

四则运算表达式算法的基本思想是:

⑴首先置操作数栈OPND为空栈,表达式起始符“#”为OPTR栈的栈底元素。

⑵依次读入表达式中的每个字符,是操作数则进栈OPND,是运算符就和OPTR栈的栈顶元素比较后,依据相应的优先权进行操作,直至整个表达式求值完毕(标志是两个运算符都为“#”)。

4.2详细的优先级关系:

Op2

Op1

+

-

*

/

#

+

>

>

<

<

<

>

>

-

>

>

<

<

<

>

>

*

>

>

>

>

<

>

>

/

>

>

>

>

<

>

>

<

<

<

<

<

=

>

>

>

>

>

>

#

<

<

<

<

<

=

 

4.3具体的操作集合:

栈的设计:

typedefstruct{

ElemTypedata[StackSize];

inttop;

}SeqStack;

voidInit(SeqStack*s);//初始化栈

intIsFull(SeqStack*s);//判断栈是否已满

intIsEmpty(SeqStack*s);//判断栈是否是空

voidPush(SeqStack*s,ElemTypex);//进行入栈操栈

ElemTypePop(SeqStack*s);//进行出栈操作

ElemTypegetTop(SeqStack*s);//提取栈顶元素

函数运算:

intAdvan(intt1,intt2);//判断符号的优先级

intIn(intc);//判断c是否为运算符

intOprea(inta,inttheta,intb);//进行四则运算

intEvaluteExpression();//进行算术表达式求值

 

5.程序实现

//stack.h中

#ifndef_STACK_H

#define_STACK_H

#defineStackSize100

#defineMaxLength100

typedefintElemType;

typedefstruct{

ElemTypedata[StackSize];

inttop;

}SeqStack;

voidInit(SeqStack*s);//初始化栈

intIsFull(SeqStack*s);//判断栈是否已满

intIsEmpty(SeqStack*s);//判断栈是否是空

voidPush(SeqStack*s,ElemTypex);//进行入栈操栈

ElemTypePop(SeqStack*s);//进行出栈操作

ElemTypegetTop(SeqStack*s);//提取栈顶元素

#endif

//stack.c中

#include"stack.h"

#include

#include

voidInit(SeqStack*s)//初始化?

{

s->top=-1;

}

intIsFull(SeqStack*s)//判断栈是否已满

{

returns->top==StackSize-1;

}

intIsEmpty(SeqStack*s)//判断栈是否是空

{

returns->top==-1;

}

voidPush(SeqStack*s,ElemTypex)//进行入栈操栈

{

if(IsFull(s)){

printf("栈已经溢出。

");

exit

(1);

}

s->top++;//栈顶指针加1

s->data[s->top]=x;//栈顶为新插入的值,data是数组,s->top数字

}

ElemTypePop(SeqStack*s)//进行出栈操作

{

if(IsEmpty(s)){

printf("栈是空的");

exit

(1);

}

returns->data[s->top--];//先删除栈顶的元素,然后指针减一

}

ElemTypegetTop(SeqStack*s)//提取栈顶元素

{

if(IsEmpty(s)){

printf("栈是空的");

exit

(1);

}

returns->data[s->top];

}

//operstack.h中

#ifndef_OPERSTACK_H

#define_OPERSTACK-H

intAdvan(intt1,intt2);//判断符号的优先级

intIn(intc);//判断c是否为运算符

intOprea(inta,inttheta,intb);//进行四则运算

intEvaluteExpression();//进行算术表达式求值

#endif

//operstack.c中

#include"stack.h"

#include

#include

#include"operstack.h"

intAdvan(intt1,intt2)//判断符号的优先级

{

intf;

switch(t2)

{

case'+':

//若t2符号是“+”“-”

case'-':

if(t1=='('||t1=='#')

f='<';

else

f='>';

break;

case'*':

//若t2符号是*,/时

case'/':

if(t1=='*'||t1=='/'||t1==')')

f='>';

else

f='<';

break;

case'(':

//若t2符号是(,此时应该优先级小继续输入,而不进行运算

if(t1==')'){

printf("ERROR括号不匹配\n");

exit(0);

}

else

f='<';

break;

case')':

//若t2符号是),此时一个括号已经完整,应该进行运算

switch(t1)

{

case'(':

f='=';

break;

case'#':

printf("ERROR缺少左括号\n");

exit(0);

default:

f='>';

}

break;

case'#':

//若t2取出时是#,表示已经要计算最后一个表达式了

switch(t1)

{

case'#':

f='=';

break;

case'(':

printf("ERROR缺少右括号\n");

exit(0);

default:

f='>';

}

}

returnf;

}

 

intIn(intc)//判断c是否为运算符

{

switch(c)

{

case'+':

case'-':

case'*':

case'/':

case'(':

case')':

case'#':

return1;

default:

return0;

}

}

intOprea(inta,inttheta,intb)//进行四则运算

{

intc;

switch(theta)

{

case'+':

c=a+b;

break;

case'-':

c=a-b;

break;

case'*':

c=a*b;

break;

case'/':

c=a/b;

break;

}

returnc;

}

intEvaluteExpression()//进行算术表达式求值

{

SeqStackOPTR,OPND;//构建两个栈,一个是放操作符,一个是放数据

inta,b,d,x,theta;

charc;//存放键盘接收的字符

charz[6];//存放整数串

inti;

Init(&OPTR);//初始化运算符栈

Push(&OPTR,'#');//#入栈,#是表达式结束的标志

Init(&OPND);//初始化数据栈

c=getchar();//从键盘读入下一个字符到c

x=getTop(&OPTR);//x赋值为运算符栈顶元素

while(c!

='#'||x!

='#'){//当读入两个字符都为#时,则停止,返回最后的//结果X的值,否则继续进行运算

if(In(c)){//是运算符

switch(Advan(x,c))

{

case'<':

Push(&OPTR,c);//优先级低,继续进行输入

c=getchar();

break;

case'=':

x=Pop(&OPTR);//脱括号并计算下一个值

c=getchar();

break;

case'>':

theta=Pop(&OPTR);//优先级高,此时进行运算,从操//作栈中取出一个运算符

b=Pop(&OPND);//从数据栈中取出两个数

a=Pop(&OPND);

Push(&OPND,Oprea(a,theta,b));//然后通过这两个数进行运算}

}elseif(c>='0'&&c<='9'){//是数字

i=0;

do{

z[i]=c;

i++;

c=getchar();

}while(c>='0'&&c<='9');

z[i]=0;//整数串结束

d=atoi(z);//将字符串转化为整数放入d中

Push(&OPND,d);//一个整数入到数据栈中

}else{//两者以外显然不可能,出错

printf("ERROR出现了非法的字符,表达式不符合格式\n");

exit(0);

}

x=getTop(&OPTR);

}

x=getTop(&OPND);

returnx;

}

 

6.程序测试

6.1正确的结果

6.2错误1

 

6.3错误2

6.4错误3

 

7.收获及体会:

该程序经过调试已经能够运行,并且能够正确的输出答案以及错误的提示。

通过本次数据结构课程设计,能够更加深刻的体会栈的特点,更熟悉栈的相关操作,以及如何运用栈的相关知识解决生活中的实际问题。

 

参考文献:

[1]李文书.数据结构与算法应用实践教程.北京大学出版社.2012.02

[2]戴文华赵君喆.数据结构项目实训.人民邮电出版社.2012.09

[3]李业丽程晓锦齐亚莉.数据结构实验教程(基于c语言).清华大学出版社.2014.04

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 药学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1