当前位置:文档之家› 四则运算表达式求值

四则运算表达式求值

四则运算表达式求值
四则运算表达式求值

一、需求分析

1.程序说明:

本程序利用二叉树的后序遍历实现表达式的转换,同时可以使用本程序的结果求解后缀表达式的值

2.输入输出的形式:

输入:21+23*(12-6)

输出:21 23 12 6 -*+

计算结果为:159

3.输入输出范围:

程序仅计算int类型的数,输入输出的结果均在int类型的限定范围内

4.测试数据

第一组:

输入:21+23*(12-6)

输出:21 23 12 6 -*+

计算结果为:159

第二组:

输入:9+(3-1)*3+10/2

输出:9 3 1-3*+ 10 2/+

计算结果为:20

第三组:

输入:( ( 35 + 15 ) * ( 80 – 70 ) ) / 20

输出:35 15 + 80 70 - * 20 /

计算结果为:25

第四组:

输入:14×8/7-20×3

输出:14 8 × 7 / 20 3 × -

计算结果为:-44

第五组:

输入:10×8+9×6-(6+4)

输出:10 8 ×+ 9 6 ×- 6 4 +

计算结果为:124

二、概要设计

抽象数据类型

由于中序遍历表达树,将得到中缀表达式;后序遍历表达式树,将得到

后缀表达式,而使用栈对后序表达式求取较为方便

因此,获取的四则运算表达式使用线性表临时存储,再转存至二叉树中,

利用二叉树,得到后缀表达式,通过栈,对后缀表达式求值

线性表ADT

{

数据对象:

D={ a i | a i∈ElemSet, i=1,2,...,n, n≥0 }

//称 n 为线性表的表长

//称 n=0 时的线性表为空表

数据关系:

R1={ |a i-1 ,a i∈D, i=2,...,n }

//设线性表为 (a1,a2, . . . ,a i,. . . ,a n),

//称 i 为 a i 在线性表中的位序。

基本操作:

void clear() = 0; //清空线性表

bool append(const Elem&) = 0; //线性表尾添加元素,若添加失败,返回false void setStart() = 0; //将当前位序设置为线性表头

bool setPos(int pos) = 0; //设置当前位序,若表空,返回false

Elem getValue() = 0; //获取当前元素

}

//二叉树节点

ADT of BinaryTreeNode

{

数据对象D:

D是具有相同特性的数据元素的集合

数据关系R:

若D为空集,则称为空树。

否则:

(1) 在D中存在唯一的称为根的数据元素root;

(2) 当n>1时,其余结点可分为不相交的有限集

T l、 T r,其中每一个子集本身又是一棵符合

本定义的二叉树,称为根root的子树

基本操作M:

Elem& val() = 0; // Return the node's element

void setVal(const Elem&) = 0; // Set the node's element

BinNode* left() const = 0; // Return the node's left child

void setLeft(BinNode*) = 0; // Set the node's left child

BinNode* right() const = 0; // Return the node's right child

void setRight(BinNode*) = 0; // Set the node's right child

bool isLeaf() = 0; // Return true iff the node is a leaf

}

//栈ADT

ADT of stack

{

数据对象D:

D={ a i | a i ∈ElemSet, i=1,2,...,n, n≥0 }

数据关系R:

R1={ | a i-1, a i∈D, i=2,...,n }

约定a n端为栈顶,a1 端为栈底

基本操作M:

// Reinitialize the stack

void clear() = 0;

// Push an element onto the top of the stack.

bool push(const Elem&) = 0;

// Remove the element at the top of the stack.

bool pop(Elem&) = 0;

// Get a copy of the top element in the stack

bool topValue(Elem&) const = 0;

// Return the number of elements in the stack.

int length() const = 0;

}

//二叉树ADT

ADT of BTree

{

数据对象D:

D是具有相同特性的数据元素的集合

数据关系R:

若D为空集,则称为空树。

否则:

(1) 在D中存在唯一的称为根的数据元素root;

(2) 当n>1时,其余结点可分为不相交的有限集

T l、 T r,其中每一个子集本身又是一棵符合

本定义的二叉树,称为根root的子树

基本操作M:

Btree( BTNode* r = nullptr ); //构造树

~Btree(); //析构树

void CreatTree(List str); //将表达式以树的形式存储 void PosOrder(List str); //用str返回后缀表达式,}

算法的基本思想

获取四则运算表达式,将四则运算表达式存储至一颗二叉树,通过二叉树的基本操得到到四则运算表达式的后缀表达式,输出后缀表达式,计算后缀表达式结果并输出

程序模块

输入模块:获取输入,并将表达式临时存储至线性表

存储模块:将表达式序列存储至二叉树中

处理模块:得到后缀表达式,计算后缀表达式

输出模块:输出后缀表达式以及计算结果

三:详细设计

由于输入的表达式长度不确定,所以

采用链式,实现用于临时存储表达式序列的线性表

采用链式,实现二叉树

采用链式,实现栈

物理数据类型

//BTreeNode基本操作实现

template

class BinNodePtr : public BinNode

{

private:

Elem it; // The node's value

BinNodePtr* lc; // Pointer to left child

BinNodePtr* rc; // Pointer to right child

public:

BinNodePtr() { lc = rc = NULL; }

BinNodePtr(Elem e, BinNodePtr* l =NULL, BinNodePtr* r =NULL)

{ it = e; lc = l; rc = r; }

Elem& val() { return it; }

void setVal(const Elem& e) { it = e; }

inline BinNode* left() const

{ return lc; }

void setLeft(BinNode* b)

{ lc = (BinNodePtr*)b; }

inline BinNode* right() const

{ return rc; }

void setRight(BinNode* b)

{ rc = (BinNodePtr*)b; }

bool isLeaf()

{ return (lc == NULL) && (rc == NULL); }

};

核心算法描述

1.语言描述:

第一步:构造一个空的线性表

第二步:从键盘获取表达式序列,通过线性表的append操作将获取

的表达序列临时存储至线性表L中

第三步:调用二叉树的CreatTree操作,将表达式序列L存储至二叉

树中

第三步:调用二叉树的PosOrder操作,得到后缀表达式序列L,并输

第四步:构造两个空栈整数栈A,字符栈B,遍历后缀表达式L,如

果遍历的当前元素不是运算符,(Ascll值!=40、41、42、43、45、

47),将该字符转化为操作数(将字符转化为int整数),并将该整数

入栈A

否则,将该字符入栈B从B中出栈栈顶元素,得到运算符c,同时从A

中两次出栈,得到两个操作数a b,计算a c b(switch), 并将计算

结果入栈A,重复2步骤,直到栈B为空A出栈,此时出栈元素即计算结果,并输出出栈元素的值

2.伪代码

//主程序

LList str;

char ch;

do // 获取输入,并存储至线性表中

{

cin >> ch;

cin.ignore(1024, '\n');

str.append(ch);

}

while(ch != '\n');

BTree expression;

BTree.generateTree(str); //表达式存储至二叉树中

BTree.posOrder(str); //得到后缀表达式

while(str.getValue() != '\0') //输出后缀表达式

{

cout << str.getValue();

str.next();

}

cout << calc(str);//输出结果

//calculate function

int calc(LList* str) //计算后缀表达式的伪代码

{

LStack num;

int num1,num2,value;

int length = str.length();

for(int i=0;i

{

for(int i = 0; i < length; ++i)

{

if(!isOper(str.getValue()))

num.push(str.getValue()-48);

str.next();

}

else

{

if(num.size()<2)

{

cout<<"Error in infix expression!\n";

exit(0);

}

num1=num.top(); num.pop();

num2=num.top(); num.pop();

if(str[i]=='+') value=num2+num1;

if(str[i]=='-') value=num2-num1;

if(str[i]=='*') value=num2*num1;

if(str[i]=='/')

{

if(num1==0)

{

cout<<"Can't evaluate the expression !";

exit(1);

}

else value=num2/num1;

}

num.push(value);

}

}

return num.top();

}

3.复杂度分析

Calculate时间复杂度为○(n)

创建二叉树时间复杂度为○(n)

得到后缀表达式时间复杂度○(nlgn)

程序时间复杂度○(nlgn)

四、输入输出格式

输入:无错的一串表达式序列

( 35 + 15 ) * ( 80 - 70 ) /20

输出:四则运算表达式序列对应的后缀表达式形式

/ * + 35 15 – 80 70 20

表达式对应的结果

25

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

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

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

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

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

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

算术表达式求值演示程序

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

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;

中缀表达式求值

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

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

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

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

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}

表达式求值课程设计报告

表达式求值课程设计报告 表达式求值 《数据结构》 课程设计报告 题目: 栈的应用:表达式求值 (系): 信息科学与工程学院院 专业班级: 软件工程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(培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提 高程序设计水平。

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

课程设计 教学院 课程名称 题目 专业 班级 姓名 同组人员 指导教师 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),把一 个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码 见附录,并有具体解释)

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

课程设计报告 课程名称数据结构 课题名称中缀算术表达式求值 专业通信工程 班级通信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。 正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现

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

目录 1.前言 (2) 2.问题描述 (3) 3.总体设计·····················································································错误!未定义书签。 3.1 概要设计 ······························································································错误!未定义书签。 3.1.1 数据结构的选择 (3) 3.1.2 相关功能函数 (3) 3.1.3 函数模块调用关系 (4) 3.2详细设计和编码 (5) 4.运行与测试 (9) 4.1 上机调试 (9) 4.2 算法时间和空间性能分析 (10) 4.3程序运行测试结果 (11) 5. 总结与心得 (13) 5.1设计中难点的总结以及其它解决方案 (13) 5.2 实验心得 (14) 6. 用户使用说明 (16) 7. 参考文献 (16) 8. 附录1(源代码清单) (16) 9. 附录2(成绩评定表) (25) 1

1.前言 课程设计是实践性教学中的一个重要环节,它以某一课程为基础,它可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。 在数据结构的学习和课程设计过程中,我发现它要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,都必须加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。对于我们专业来说,虽然说对技术要求不是特别高,但是在实际操作过程中,没有足够的专业知识对于编程来说是远远不可以达到要求的,所以对于这次的课程设计,我们必须要通过自己额外补充知识来完成它。 在这次的课程设计中我选择的题目是表达式的求值演示。它的基本要求是:以字符序列的形式从终端输入语法正确的,不含变量的表达式。利用算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。对于表示出栈在每执行一个过程中都要输出它的变化,这点我认为在编程中是比较困难的,以我自身的能力,是不可能在规定的时间内完成任务的,所以我参考了很多有价值的书籍来帮助我完成我的程序设计。 2

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)//初始化栈

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

二课程设计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; } int Push(SqStack &s,char e) //运算符入栈 { if (s.top-s.base >= s.stacksize) { printf("运算符栈满!\n"); s.base=(char*)realloc (s.base,(s.stacksize+5)*sizeof(char) ); //栈满的时候,追加5个存储空间 if(!s.base) exit (OVERFLOW); s.top=s.base+s.stacksize; s.stacksize+=5; } *(s.top)++=e; //把e入栈 return OK; } int Pop(SqStack &s,char &e) //运算符出栈 { if (s.top==s.base) //栈为空栈的时候,返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else {

算术表达式求值课设报告

数据结构课程设计 设计说明书表达式求值算法的实现((()()(( 学生姓名 学号 班级 成绩 指导教师 数学与计算机科学学院 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");

算术表达式求值系统

数据结构课程设计报告 课设题目:算式表达式求值系统 班级: 软件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 (二)实现方法

基于栈结构的中缀表达式求值

实验3:栈与队列实验 ——基于栈结构的中缀表达式求值 一、问题描述 从键盘输入任意中缀表达式字符串,读字符串,利用栈结构实现表达式求值。 二、输入与输出 输入:从键盘中缀表达式如: 32+5×(6-4) 输出:计算结果42 三、需求分析 1.定义两个栈结构,数栈用于存放表达式中的数,符号栈用于存放表达式中的符号,实现栈的运算 2.在读数的时候考虑多位运算 3.实现表达式求值 四、开发工具与环境 硬件设备:微型计算机系统 软件环境:操作系统Windows 开发工具:Devc++ 五、概要设计 参考结构定义 typedef struct /* 运算符栈 */ { char *base,*top; int stacksize; }SqStack; typedef struct /* 运算数栈 */ { int *base,*top; int stacksize; }SqStack1; int priority[7][7]={{'>', '>', '<', '<', '<', '>', '>'}, // + {'>', '>', '<', '<', '<', '>', '>'}, // -

{'>', '>', '>', '>', '<', '>', '>'}, // * {'>', '>', '>', '>', '<', '>', '>'}, // / {'<', '<', '<', '<', '<', '=', ' '}, // ( {'>', '>', '>', '>', ' ', '>', '>'}, // ) {'<', '<', '<', '<', '<', ' ', '='} // # }; /*用于比较符号优先级的全局二维数组*/ 2.各函数模块 void InitStack(SqStack *s); 操作结果:初始化运算符栈 char GetTop(SqStack *s); 操作结果:得到运算符栈的栈顶元素 void Push(SqStack *s,char e); 操作结果:对运算符栈进行压栈操作 int IsNumber(char c); 操作结果:判断一个字符是否是数字 int MidExpression_Eval(char Express[]); 操作结果:计算中缀表达式的值 int Operate (int a,char x,int b); 操作结果:计算表达式axb,并返回结果 六、详细设计 #include #include using namespace std; /*定义区*/ #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW -1 #define ERROR 0 #define OK 1 //运算符栈 typedef struct { char *base, *top; int stacksize; }SqStack; //运算数栈 typedef struct { int *base, *top; int stacksize;

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

实用标准文档 二课程设计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; }

表达式求值程序设计说明书

汇编语言实训课程设计任务书 题目:表达式求值程序班级:计算机科学与技术一班 学生姓名:赵旭尧学号: 14730141 题目类型:软件工程(R)指导教师:刘树群 一.题目简介 该设计要求学生使用汇编语言,设计并开发出针对四则运算表达式进行求 值的命令行或窗口程序。 通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇 编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进 行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。 得到软件工程的综合训练,提高解决实际问题的能力。 二.设计任务 1、查阅文献资料,一般在5篇以上; 2、通过键盘输入表达式,进行针对整数的“加减乘除”四则运算表达式 进行求值,有良好的界面; 3、完成软件结构设计和算法设计; 4、完成系统的软件开发和测试工作; 5、撰写设计说明书; 6、做好答辩工作。 三.主要内容、功能及技术指标 1、实现功能及指标:①使用Win32的窗口程序模式,实现表达式求值程序 及测试界面程序的设计与开发;②支持整数的四则运算、位运算和小括号等; ③使用文本框对表达式进行交互式编辑和输出。 2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求 做什么。在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结 构清晰、合理、简单和易于调试。最后确定每个过程和函数的简单功能,以及 过程(或函数)之间的调用关系,并画出函数之间的调用关系图。 3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出 流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200 行,否则要进一步划分。

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

实验表达式求值问题 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) {

数据结构课程设计算术表达式求值-计算器(Word)

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

算术表达式求值 系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。 第二章系统分析 开始运行时界面如下: 你可以输入一个表达式,按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 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]!=')') {

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