1、6.2错误1 136.3错误2 136.4错误3 137.收获及体会: 15参考文献:1.前言1.1课题内容及要求题目39:算术表达式的求解问题描述:给定一个算术表达式,通过程序求出最后的结果。基本要求:从键盘输入要求解的算术表达式;采用栈结构进行算术表达式的求解过程;能够判断算术表达式正确与否;对于错误表达式给出提示;对于正确的表达式给出最后的结果;1.2选题目的及意义进一步熟悉和使用栈的基本操作,如栈的初始化,进栈,出栈的特性。学习在实际生活中使用栈来解决问题。2.系统分析2.1问题描述要正确计算表达式的值,必须要正确的解释表达式。首先解释算术表达式的运算规则,分为以下三点:先乘除后加减;
2、从左往右进行计算;有括号的,先算括号内的;任何一个表达式都是由运算符,操作数和界限符组成的。这里把运算符,界限符统称为算符。设两个操作符分别为op1和op2。为实现运算符的优先法则,优先关系会出现三种情况,op1的优先级高于op2的优先级,op1的优先级等于op2的优先级,op1的优先级小于op2的优先级。对于输入错误的,比如出现了表达式以外的非法字符,没有按照正确格式进行输入。系统会给出提示。 3.系统概要设计3.1系统总体架构设计3.2系统模块的设计为了更好的服务,结合用户的需求,有如下的模块设计:程序主要包括三个模块:主函数设计模块int main() 函数体栈模块:一些本程序需要的操作
3、,如初始化栈,定义栈,出栈,入栈,取栈顶元素。运算模块:对一些优先级的定义,以及基本的算术运算。4.系统详细设计为实现运算符的优先算法,可以用两个栈:运算符栈OPTR,操作数栈OPND。四则运算表达式算法的基本思想是:首先置操作数栈OPND为空栈,表达式起始符“#”为OPTR栈的栈底元素。依次读入表达式中的每个字符,是操作数则进栈OPND,是运算符就和OPTR栈的栈顶元素比较后,依据相应的优先权进行操作,直至整个表达式求值完毕(标志是两个运算符都为“#”)。 Op2Op1+-*/()#=栈的设计:typedef struct ElemType dataStackSize; int top; S
4、eqStack;void Init(SeqStack *s); /初始化栈int IsFull(SeqStack *s); /判断栈是否已满int IsEmpty(SeqStack *s); /判断栈是否是空void Push(SeqStack *s,ElemType x); /进行入栈操栈 ElemType Pop(SeqStack *s); /进行出栈操作ElemType getTop(SeqStack *s); /提取栈顶元素函数运算:int Advan(int t1,int t2); /判断符号的优先级int In(int c); /判断c是否为运算符 int Oprea(int a,
5、int theta,int b); /进行四则运算 int EvaluteExpression(); /进行算术表达式求值5.程序实现/stack.h 中#ifndef _STACK_H#define _STACK_H#define StackSize 100#define MaxLength 100typedef int ElemType; /提取栈顶元素 #endif/stack.c中#include stack.h#include stdlib.hvoid Init(SeqStack *s) /初始化? s-top=-1;int IsFull(SeqStack *s) /判断栈是否已满
6、return s-top=StackSize-1;int IsEmpty(SeqStack *s) /判断栈是否是空top=-1;void Push(SeqStack *s,ElemType x) /进行入栈操栈 if(IsFull(s) printf(栈已经溢出。); exit(1); top+; /栈顶指针加1 datas-top=x; /栈顶为新插入的值,data是数组,s-top数字 ElemType Pop(SeqStack *s) /进行出栈操作 if(IsEmpty(s)栈是空的 data s-top-; /先删除栈顶的元素,然后指针减一 ElemType getTop(SeqS
7、tack *s) /提取栈顶元素 top;/operstack.h 中#ifndef _OPERSTACK_H#define _OPERSTACK-H /进行算术表达式求值 /operstack.c 中operstack.hint Advan(int t1,int t2) /判断符号的优先级 int f; switch(t2) case +: /若t2符号是“+”“-” - if(t1=(|t1=# f=; else break; * /若t2符号是 *, /时 /) /若t2符号是(,此时应该优先级小继续输入,而不进行运算 ) printf(ERROR 括号不匹配n exit(0); bre
8、ak; /若t2符号是),此时一个括号已经完整,应该进行运算 switch(t1) case f= break;printf(ERROR 缺少左括号n exit(0); default: /若t2取出时是#,表示已经要计算最后一个表达式了 ERROR 缺少右括号n return f;int In(int c) /判断c是否为运算符 switch(c)return 1; default :return 0;int Oprea(int a,int theta,int b) /进行四则运算 int c; switch(theta) c=a+b; c=a-b; c=a*b; c=a/b; return
9、 c;int EvaluteExpression() /进行算术表达式求值 SeqStack OPTR,OPND; /构建两个栈,一个是放操作符,一个是放数据 int a,b,d,x,theta; char c; /存放键盘接收的字符 char z6; /存放整数串 int i; Init(&OPTR); /初始化运算符栈 Push(&OPTR, /#入栈,#是表达式结束的标志 OPND); /初始化数据栈 c=getchar(); /从键盘读入下一个字符到c x=getTop(& /x赋值为运算符栈顶元素 while(c!|x!) /当读入两个字符都为#时,则停止,返回最后的 / 结果X的值
10、 ,否则继续进行运算 if(In(c) /是运算符 switch(Advan(x,c)Push(&OPTR,c); /优先级低 ,继续进行输入 c=getchar();x=Pop(& /脱括号并计算下一个值 theta=Pop(& /优先级高,此时进行运算,从操 /作栈中取出一个运算符 b=Pop(& /从数据栈中取出两个数 a=Pop(& Push(&OPND,Oprea(a,theta,b); / 然后通过这两个数进行运算 else if(c0&c zi=0; /整数串结束 d=atoi(z); /将字符串转化为整数放入d中 Push(&OPND,d); /一个整数入到数据栈中 else
11、/两者以外显然不可能,出错 printf(ERROR 出现了非法的字符,表达式不符合格式n exit(0); x=getTop(& return x;6.程序测试6.1正确的结果6.2错误16.3错误26.4错误3该程序经过调试已经能够运行,并且能够正确的输出答案以及错误的提示。通过本次数据结构课程设计,能够更加深刻的体会栈的特点,更熟悉栈的相关操作,以及如何运用栈的相关知识解决生活中的实际问题。1 李文书数据结构与算法应用实践教程北京大学出版社2012.022 戴文华 赵君喆数据结构项目实训人民邮电出版社2012.093 李业丽 程晓锦 齐亚莉数据结构实验教程(基于c语言)清华大学出版社2014.04
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1