数据结构算术表达式求解Word文档格式.docx

上传人:b****2 文档编号:13321821 上传时间:2022-10-09 格式:DOCX 页数:18 大小:66.37KB
下载 相关 举报
数据结构算术表达式求解Word文档格式.docx_第1页
第1页 / 共18页
数据结构算术表达式求解Word文档格式.docx_第2页
第2页 / 共18页
数据结构算术表达式求解Word文档格式.docx_第3页
第3页 / 共18页
数据结构算术表达式求解Word文档格式.docx_第4页
第4页 / 共18页
数据结构算术表达式求解Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构算术表达式求解Word文档格式.docx

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

数据结构算术表达式求解Word文档格式.docx

4

4.2详细的优先级关系:

4.3具体的操作集合:

5.程序实现6

6.程序测试13

6.1正确的结果13

6.2错误113

6.3错误213

6.4错误313

7.收获及体会:

15

参考文献:

1.前言

1.1课题内容及要求

题目39:

算术表达式的求解

问题描述:

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

基本要求:

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

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

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

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

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

1.2选题目的及意义

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

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

2.系统分析

2.1问题描述

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

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

⑴先乘除后加减;

⑵从左往右进行计算;

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

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

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

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

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

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

系统会给出提示。

3.系统概要设计

3.1系统总体架构设计

3.2系统模块的设计

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

程序主要包括三个模块:

⑴主函数设计模块

intmain(){

函数体

}

⑵栈模块:

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

⑶运算模块:

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

4.系统详细设计

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

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

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

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

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

Op2

Op1

+

-

*

/

#

>

<

=

栈的设计:

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;

//提取栈顶元素

#endif

//stack.c中

#include"

stack.h"

#include<

stdio.h>

stdlib.h>

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

{

s->

top=-1;

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

returns->

top==StackSize-1;

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

top==-1;

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

if(IsFull(s)){

printf("

栈已经溢出。

"

);

exit

(1);

}

top++;

//栈顶指针加1

data[s->

top]=x;

//栈顶为新插入的值,data是数组,s->

top数字

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

if(IsEmpty(s)){

栈是空的"

}

data[s->

top--];

//先删除栈顶的元素,然后指针减一

}

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

top];

//operstack.h中

#ifndef_OPERSTACK_H

#define_OPERSTACK-H

//进行算术表达式求值

//operstack.c中

operstack.h"

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

intf;

switch(t2)

{

case'

+'

:

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

-'

if(t1=='

('

||t1=='

#'

f='

'

;

else

break;

*'

//若t2符号是*,/时

/'

)'

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

){

printf("

ERROR括号不匹配\n"

exit(0);

}

break;

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

switch(t1)

{

case'

f='

='

break;

printf("

ERROR缺少左括号\n"

exit(0);

default:

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

ERROR缺少右括号\n"

}

}

returnf;

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

{

switch(c)

return1;

default:

return0;

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

intc;

switch(theta)

c=a+b;

c=a-b;

c=a*b;

c=a/b;

returnc;

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

SeqStackOPTR,OPND;

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

inta,b,d,x,theta;

charc;

//存放键盘接收的字符

charz[6];

//存放整数串

inti;

Init(&

OPTR);

//初始化运算符栈

Push(&

OPTR,'

//#入栈,#是表达式结束的标志

I

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

当前位置:首页 > PPT模板 > 可爱清新

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

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