表达式求值

实验一:算术表达式求值问题

题目:编制一个利用栈求解算数表达式的程序

班级:姓名:学号:完成日期:

一.需求分析

1.问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型的例子

2.基本要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。实现对算术四则混合运算表达式的求值,并仿照教科书的例3-1的演示在求值中实现运算符栈、运算数栈、输入字符和主要操作的变化过程。

3.演示程序:是用户在计算机终端进行输入而执行操作。

4.执行程序:本程序为了使用具体,采用列表式的方式来完成程序的演示,只需按提示输入表达式即可。(输入时以指定字符结束,否则出错!)

5.测试数据:教科书例3-1的算术表达式3*(7-2),,以及下列表达式8;1+2+3+4 ;

2*(6+2*(3+6*(6+6)));(((6+6)*6+3)*2+6)*2;

二.概要设计

1.任意两个相继出现的算符θ1和θ2之间的优先关系至多是下列3种关系之一:

2.为实现上述功能,应建立两个栈,一个是运算符栈,另一个是运算数栈。为此,需要有一个栈的抽象数据类型。

该栈的抽象数据类型定义为:

ADT Stack{

数据对象:D={a i| a i∈ElemSet,i=1,2,3……,n,n≥0}

数据关系:R1={| a i-1,a i∈D,i=1,2,3,……,n}

约定其中a i端为栈底,a n端为栈顶。

基本操作:

(1.)对运算符栈的基本操作:

void InitStack1(Stack1 &S1); //声明栈建立函数

操作结果:构造一个空栈(运算符栈)

void Push1(Stack1 &S1,char e); //声明入栈函数

初始条件:运算符栈S1已存在

操作结果:插入字符元素e为新的栈顶元素

char GetTop1(Stack1 &S1); //声明取栈顶元素函数初始条件:运算符栈S1已存在且非空

操作结果:返回栈S1的栈顶元素

char Pop1(Stack1 &S1); //声明出栈函数

初始条件:运算符栈S1已存在

操作结果:删除S1的栈顶元素,并用e返回其值

void ShowStack1(Stack1 &S1); //从栈底到栈顶依次输出各元素初始条件:栈S1存在且不为空

操作结果:从栈底到栈顶依次输出各元素

(2.)对运算数栈的基本操作:

void InitStack2(Stack2 &S2); //声明栈建立函数

操作结果:构造一个空栈(运算数栈)

void Push2(Stack2 &S2,float e); //声明入压栈函数初始条件:运算数栈S2已存在

操作条件:插入浮点型元素e为新的栈顶元素

float GetTop2(Stack2 &S2); //声明取栈顶元素函数初始条件:运算数栈S2已存在

操作结果:用e返回栈S2的栈顶元素

float Pop2(Stack2 &S2); //声明出栈函数

初始条件:运算数栈S2已存在

操作结果:删除S2的栈顶元素,并用e返回其值

void ShowStack2(Stack2 &S2); //从栈底到栈顶依次输出各元素初始条件:栈S2存在且不为空

操作结果:从栈底到栈顶依次输出各元素

(3.)对表达式的基本操作:

void evaluate(Stack1 &S1,Stack2 &S2); //确定如何入栈函数初始条件:栈S1和S2已存在

操作结果:实现字符的入栈操作

char Compare(char m,char n); //声明比较函数

操作结果:比较运算符的优先级

float Operate(float a,char ch,float b); //声明运算函数操作结果:实现表达式的运算

}ADT Stack

3.此抽象数据类型中的一些常量如下:

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

4.栈结构体的定义如下所示:

typedef struct //运算符栈

{

char *base;

char *top;

int stacksize;

}Stack1;

typedef struct //运算数栈

{

float *base;

float *top;

int stacksize;

}Stack2;

5.本程序包含三个模块

1).主程序模块

void main( )

{

初始化;

调用函数;

函数实现;

}

2).栈模块——实现栈中的抽象数据类型

3).表达式求值模块——实现表达式的求值操作

各模块之间的调用关系如下:

主程序模块

栈模块

表达式求值模块

6.表达式求值入栈及出栈的伪码算法:

表达式求值(开始)

{

将‘#’入栈,作为低级运算符

输入不含变量的表达式(以#结束!)

如果c!='#'||GetTop1(S1)!='#'

如果输入的字符如果不是运算符号,则继续输入直到输入的是运算符为止,将非运算符转换成浮点数

如果输入的是运算符

遇到运算符,则将之前输入的操作数进栈

比较运算符的优先级

栈顶元素优先级低,则入栈且继续输入

栈顶元素优先级相等,脱括号并接收下一字符

栈顶元素优先级高,则退栈并将运算结果入栈

显示表达式最终结果

}//结束

三.详细设计

// 表达式求值.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include

using namespace std;

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct //运算符栈

{

char *base;

char *top;

int stacksize;

}Stack1;

typedef struct //运算数栈

{

float *base;

float *top;

int stacksize;

}Stack2;

/*************************************************************

函数的申明

*************************************************************/

void InitStack1(Stack1 &S1); //声明栈建立函数

void InitStack2(Stack2 &S2); //声明栈建立函数

void Push1(Stack1 &S1,char e); //声明入栈函数

void Push2(Stack2 &S2,float e); //声明入压栈函数

char GetTop1(Stack1 &S1); //声明取栈顶元素函数

float GetTop2(Stack2 &S2); //声明取栈顶元素函数

char Pop1(Stack1 &S1); //声明出栈函数

float Pop2(Stack2 &S2); //声明出栈函数

void evaluate(Stack1 &S1,Stack2 &S2);//确定如何入栈函数

char Compare(char m,char n); //声明比较函数

float Operate(float a,char ch,float b);//声明运算函数

void ShowStack1(Stack1 &S1); //从栈底到栈顶依次输出各元素

void ShowStack2(Stack2 &S2); //从栈底到栈顶依次输出各元素

/*************************************************************

运算符栈函数的定义

*************************************************************/

void InitStack1(Stack1 &S1)//构造一个空栈S1

{

S1.base=(char *)malloc(STACK_INIT_SIZE *sizeof(char));

if(!S1.base)

cout<<"存储分配失败!";//存储分配失败

S1.top=S1.base;

S1.stacksize=STACK_INIT_SIZE;

}

void Push1(Stack1 &S1,char e)//入栈

{

if(S1.top-S1.base>=S1.stacksize)//如果栈满,追加存储空间

{

S1.base=(char *)realloc(S1.base,(S1.stacksize+STACKINCREMENT)*sizeof(char));

if(!S1.base)

cout<<"存储分配失败!";

else

{

S1.top=S1.base+S1.stacksize;

S1.stacksize+=STACKINCREMENT;

表达式求值算法实现

湖南人文科技学院计算机科学技术系 课程设计说明书 课程名称:数据结构 课程代码: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.360docs.net/doc/6618721628.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

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

中缀表达式求值

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

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

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

实验表达式求值问题 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<<"栈创建失败,退出!"<

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

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

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

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

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

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}

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

#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)

表达式求值课程设计报告

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

表达式求值

《数据结构(C++版)》课设计报告2012—2013学年第一学期 课程名称数据结构 设计题目表达式求值 专业班级 姓名 学号 指导教师

课程设计题目:表达式求值 一、问题描述 对一个合法的中缀表达式求值。简单起见,假设表达式只包含+,-,*,/等4个双目运算符,且运算符本身不具有二义性,操作数均为一位整数。 二、基本要求 1.正确解释表达式; 2.符合四则运算规则; 3.输出最后的计算结果。 三、概要设计 对中缀表达式求值,通常使用“算符优先算法”。根据四则运算规则,在运算的每一步中,任意两个相继出现的运算符t和c之间的优先关系至多是下面三种关系之一: (1) t的优先级低于c; (2) t的优先级等于c; (3) t的优先级高于c。 为实现算符优先算法,可以使用两个工作栈:一个栈OPTR存放运算符;另一个栈OPND存放操作数,中缀表达式用一个字符串数组存储。 四、详细设计 利用类模板 #include using namespace std; const int StackSize=100; template //定义模板类SeqStack class SeqStack{ public: SeqStack( ) ; //构造函数,栈的初始化 ~SeqStack( ); //析构函数 void Push(DataType x); //将元素x入栈 DataType Pop( ); //将栈顶元素弹出 DataType GetTop( ); //取栈顶元素(并不删除) int Empty( ); //判断栈是否为空 void Printf(); private: DataType data[StackSize]; //存放栈元素的数组 int top; //栈顶指针,指示栈顶元素在数组中的下标 }; template

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

实验报告 课程名称: 程序设计与数据结构 指导老师: 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); //销毁二叉树 //二叉树结构的表达式求解算法入口

四则运算表达式求值实验报告

HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名: 学生学号: 专业班级: 指导老师: 完成日期:

一、需求分析 四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。 本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。 在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。 测试数据 输入: 21+23*(12-6) 输出: 21 23 12 6 -*+ 二、详细设计 输入和输出的格式 输入 本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式 输出 后缀表达式为://输出结果的位置 表达式的值为://输出结果的位置 三、调试分析 本次实验的难点主要是在建立二叉树的问题上。关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。 另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。 四、测试结果 五、用户使用说明(可选) 1、运行程序时 提示输入四则运算表达式 本程序可以将中缀表达式转化为后缀表达式,并计算结果 请输入四则运算表达式: 输出 后缀表达式为: 表达式的值为: 程序源代码(c++) #include #include #include #include

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

嘉应学院计算机学院 实验报告 课程名称:数据结构课程设计 开课学期:2017-2018学年第2学期 班级: 指导老师: 实验题目:学生通讯录管理系统 学号: 姓名: 上机时间:

(一) 需求分析 1、输入的形式和输入值的范围: 根据题目要求与提示,先选择你要使用的表达式形式(中缀用1,后缀用0),在输入一个中缀表达式,输入数的范围为int型,此时,程序将计算出表达式的结果。 2、输出的形式: 当按照程序要求选择了1或0之后,再输入表达式;如果选择的是1,则程序将自动运算出表达式结果;如果之前选择的是0,则程序将现将中缀表达式转化为后缀表达式并计算出结果。 3、程序所能达到的功能: 本程序能计算出含+、-、*、/、(、)等运算符的简单运算。 4、测试数据: 输入一个表达式,如果你之前选择的是“中缀表达式”,那么输入5*(4-2)#,那么输出结果是10;如果之前选择的是“后缀表达式”,那么输入5*(4-2)#,那么他将先转换成后缀表达式5 4 2 - * #,再输出结果10。 如果输入表达式没有结束标示符#,如5*(4-2),那将不会输出任何结果,或出现错误结果。 (二) 概要设计 为了实现上述操作,应以栈为存储结构。 1.基本操作: (1). int GetTop(SqStack *s) 初始条件:栈存在; 操作结果:若栈为空,则返回s的栈顶元素;否则返回ERROR。 (2). void Push(SqStack *s,int e) 初始条件:栈存在; 操作结果:插入e为新的栈顶元素。 (3). int Pop(SqStack *s) 初始条件:栈存在; 操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。 (4).void InitStack(SqStack *s) 初始条件:栈存在; 操作结果:置栈为空。 (5). int Empty(SqStack *s) 初始条件:栈存在; 操作结果:判定s是否为空栈。 (6). int Operate(int a,char theta, int b) 初始条件:操作数a和b存在,且theta是+、-、*、/四则运算; 操作结果:返回a与b间theta运算的结果。 (7). int In(char s,char* TestOp) 初始条件:s为待判断字符,TestOp为已知的算符集合; 操作结果:s为算符集合中的元素则返回1,否则返回0. (8). int ReturnOpOrd(char op,char* TestOp) 初始条件:op为待确定运算符,TestOp为已知的算符集合; 操作结果:确定运算符类型。 (9). char precede(char a, char b)

数据结构之中缀表达式转后缀表达式

我们在数学中常见的计算式,例如2+(3*4)叫做中缀表达式。表达式中涉及到了多个运算符,而运算符之间是有优先级的。计算机在计算并且处理这种表达式时,需要将中缀表达式转换成后缀表达式,然后再进行计算。 中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出; 2.栈为空时,遇到运算符,入栈; 3.遇到左括号,将其入栈; 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出; 5.遇到其他运算符'+''-''*''/'时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈; 6.最终将栈中的元素依次出栈,输出。 经过上面的步骤,得到的输出既是转换得到的后缀表达式。 举例:a+b*c+(d*e+f)*g ---------> abc*+de*f+g*+ 遇到a,直接输出: 遇到+,此时栈为空,入栈: 遇到b,直接输出:

遇到*,优先级大于栈顶符号优先级,入栈: 遇到c,输出: 遇到+,目前站内的*与+优先级都大于或等于它,因此将栈内的*,+依次弹出并且输出,并且将遇到的这个+入栈: 遇到(,将其入栈:

遇到d,直接输出: 遇到*,由于*的优先级高于处在栈中的(,因此*入栈: 遇到e,直接输出: 遇到+,栈顶的*优先级高于+,但是栈内的(低于+,将*出栈输出,+入栈:

遇到f,直接输出: 遇到),弹出栈顶元素并且输出,直到弹出(才结束,在这里也就是弹出+输出,弹出(不输出: 遇到*,优先级高于栈顶+,将*入栈: 遇到g,直接输出:

此时已经没有新的字符了,依次出栈并输出操作直到栈为空: 明白了这个过程,现在就需要用代码实现了。对于各种运算符的优先级,可以使用整数来表示运算符的级别。可以定义一个函数来返回各种符号的优先级数字: code.c /***************************************************************** *根据字符该字符是否在栈中,返回该字符的优先级。 *这里只处理+、-、*、/、(、)这些符号。 *需要注意的是:如果(在栈中,它的优先级是最低的,不在栈中则是最高的 *@param c:需要判断的字符 *@param flag:字符是否在栈中,0表示在栈中,1表示不在栈中 *****************************************************************/ int GetPrecedence(char c,int flag) { if(c=='+' || c=='-') { return 1; } else if(c=='*' || c=='/') { return 2; } else if(c=='(' && flag==0) { return 0;

数据结构课程设计算术表达式求值计算器.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]!=')')

程序设计实训报告—表达式求值问题

程序设计实训报告— 表达式求值问题 完成者:何炜 班级:计科1501 学号: 完成日期:2016年7月14日星期四

目录 一、题目的内容及要求................................. 错误!未定义书签。 二、需求分析 ................................................ 错误!未定义书签。 三、概要设计 ................................................ 错误!未定义书签。 四、详细设计 ................................................ 错误!未定义书签。 五、源代码 .................................................... 错误!未定义书签。 六、运行结果及分析..................................... 错误!未定义书签。 七、收获及体会............................................. 错误!未定义书签。

一、题目的内容及要求 求解形如(a+b)*((c+d)*e+f*h*g)的简单算术表达式的求值问题。这种表达式只包括加、减、乘、除4种运算符。 为了实现表达式求值,可以首先读入原表达式(包括括号)并创建对应二叉树,其次对二叉树进行前序遍历、中序遍历、后续遍历(非递归),并输出逆波兰表达式,最后求解原表达式的值,同时对非法表达式格式能予以判断。 用二叉树的结构来存储表达式,后续遍历二叉树即可得到逆波兰表达式 二、需求分析 本程序能解决形如(a+b)*((c+d)*e+f*h*g)并以’#’作为结束标志的简单算术表达式的求值问题。 不仅能够求解出多位浮点数,而且能够对简单的非法表达式进行判断以避免程序异常退出。 三、概要设计 1.用户输入中缀表达式 2.程序将中缀表达式用二叉树的链式存储结构存储下来 3.前序、中序遍历这颗二叉树,输出对应的前缀、中缀表达式 4.后续遍历(非递归)这颗二叉树,并把遍历结果存储在顺序栈内, 并输出后缀表达式 5.对后缀表达式进行求值

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

实验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;

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

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

中缀表达式转逆波兰式并求值

中缀表达式转逆波兰式并求值 // 标题: 栈的应用——中缀表达式转逆波兰式 // 时间: 2015年4月14日// 所有者: Vae #include #include #include #include #include #define STACK_INIT_SIZE 100 #define STACKCREATE 10 #define OK 1 #define ERROR 0 typedef struct double_stack { int *num; int *index; }DOUBLESTACK; typedef struct SqStack { DOUBLESTACK top; DOUBLESTACK base; int stacksize; }SqStack; // 函数名: InitStack // 形参类型: SqStack * // 函数功能构造一个栈void InitStack(SqStack *S) { S->base.index = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);

S->base.num = (int *)malloc(sizeof(int)*STACK_INIT_SIZE); if (!(S->base.num && S->base.index)) { printf("构造栈失败!\n"); exit(-1); } S->top.num = S->base.num; S->top.index = S->base.index; S->stacksize = STACK_INIT_SIZE; return ; } // 函数名: Push // 形参类型: SqStack *, int, int // 函数功能插入e为新的栈顶元素int Push(SqStack *S, int m, int n) { if ((S->top.num - S->base.num) >= S->stacksize) { S->base.index = (int *)realloc(S- >base.index,sizeof(int)*(STACK_INIT_SIZE+STACKCREATE)); S->base.num = (int *)realloc(S- >base.num,sizeof(int)*(STACK_INIT_SIZE+STACKCREATE)); if (!(S->base.num || S->base.index))

相关文档
最新文档