用栈实现中缀表达式转后缀表达式并构建计算机求值

用栈实现中缀表达式转后缀表达式并构建计算机求值
用栈实现中缀表达式转后缀表达式并构建计算机求值

#include

#include

#include

#include

#include

using namespace std;

class calculator

{

public:

calculator() {

}

calculator(string expression) {

getexpression(expression);

}

//获得算术表达式

void getexpression(string expression) {

e = expression;

}

~calculator() {

}

//返回中缀表达式

string ShowMiddleExpression() {

return e;

}

//计算函数, 输入为两个数和一个操作符, 返回值为计算结果(字符串形式) string calculate(string num2, string num1, string op) {

double n2, n1;

string result;

stringstream x;

x << num2;

x >> n2;

x.clear();

x << num1;

x >> n1;

x.clear();

if (op == "+")

x << (n2 + n1);

if (op == "-")

x << (n2 - n1);

if (op == "*")

x << (n2 * n1);

if (op == "/")

x << (n2 / n1);

x >> result;

x.clear();

return result;

}

//判别符号的优先级

int Priority(char a) {

if (a == '(')

return 0;

else if (a == '+' || a == '-')

return 1;

else if (a == '*' || a == '/')

return 2;

return 0;

}

//用于去除输入中多余的空格输入为要除去空格的算术表达式返回去掉空格的算术表达式

string RidSpace(string origin) {

string transfer;

for (int i = 0; i < origin.length(); i++) {

if (origin[i] != ' ')

transfer += origin[i];

}

return transfer;

}

//中缀表达式转后缀表达式, 因为要兼容多位数, 括号, 负数和小数等功能,

//由于多位数在转为后缀表达式时会分不清, 故在每个数和运算符后面加上一个空格作为区别

//expression为输出的后缀表达式

string MidToLast(string str) {

str = RidSpace(str);

string expression = "";

string number = "";

char x;

stack op;

for (int i = 0; i < str.length(); ) {

//第一位做特殊处理判断是否为负号

if (i == 0 && str[i] == '-') {

number = "-";

i++;

}

x = str[i];

//录入数字

if ((x >= '0' && x <= '9') || number == "-" || x == '.') {

while ((str[i] >= '0' && str[i] <= '9') || str[i] == '.') {

number += str[i];

i++;

}

expression += number;

//加空格以区别

expression += " ";

number = "";

continue;

} else {

//判断是括号还是运算符

if (x == '(') {

op.push(x);

//判断是否为负号

if (str[i+1] == '-') {

number = "-";

i++;

}

} else {

//遇到右括号直接弹出运算符栈里的运算符到表达式中运算符后加空格以区别

if (x == ')') {

while (op.top() != '(') {

expression += op.top();

expression += " ";

op.pop();

}

//弹出右括号

op.pop();

} else {

//弹出栈中优先级较高的运算符运算符后加空格以区别

while (!op.empty() && (Priority(op.top()) >= Priority(x))) {

expression += op.top();

expression += " ";

op.pop();

}

//判断是否为负号

if (str[i+1] == '-') {

number = "-";

i++;

}

//将运算符压入栈

op.push(x);

}

}

}

i++;

}

while (!op.empty()) {

expression += op.top();

expression += " ";

op.pop();

}

return expression;

}

//获得后缀表达式

string GetLastExpression() {

return MidToLast(RidSpace(e));

}

string exe() {

//获取后缀表达式

string le = GetLastExpression();

string tem = "";

stack num;

for (int i = 0; i < le.length(); ) {

while (le[i] != ' ') {

tem += le[i];

i++;

}

//若为数字, 压栈

if (tem.length() > 1 || (tem.length() == 1 && tem[0] >= '0' && tem[0] <= '9')) { num.push(tem);

} else {

//若为运算符, 执行运算后压栈

//处理如-()的情况

if (num.empty()) {

tem = "-";

i++;

continue;

}

string tem1 = num.top();

num.pop();

if (!num.empty()) {

string tem2 = num.top();

num.pop();

num.push(calculate(tem2, tem1, tem));

} else {

tem1 = "-" + tem1;

num.push(tem1);

}

}

i++;

tem = "";

}

return num.top();

}

private:

string e;

};

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

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

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}

中缀表达式求值

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

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

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

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

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

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

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

表达式求值算法实现

湖南人文科技学院计算机科学技术系 课程设计说明书 课程名称:数据结构 课程代码: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.

栈的应用表达式求值的设计

数据结构课程设计报告 栈的应用:表达式求值 专业 计算机科学与技术 学生姓名 班级 学 号 指导教师 完成日期 2014年7月4日

表达式求值的设计 目录 1设计内容 (1) 2设计分析 (1) 2.1后缀表达式设计 (1) 2.2 中缀到后缀的转换设计 (2) 3设计实践 (3) 3.1实现要求 (3) 3.2程序代码 (3) 4测试方法 (17) 4.1测试目的 (17) 4.2 测试输入 (17) 4.3 正确输出 (18) 4.4 实际输出 (18) 5程序运行效果 (18) 6设计心得 (19)

栈的应用:表达式求值的设计 1设计内容 设计一个表达式求值的程序。该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=a b)的中缀表达式,并求出结果。如果表达式正确,则输出表达式的结果;如果表达式非法,则输出错误信息。 输入要求:程序从“input.txt”文件中读取信息,在这个文件中如果有多个中缀表达式,则每个表达式独占一行,程序的读取操作在文件在文件的结尾处停止。 输出要求:对于每个表达式,将其结果放在“output.txt”文件的每一行中。这些结果可能是值,也可能是错误信息“ERROR IN INFIX NOTATION”。 2 设计分析 在计算机中,算术表达式的计算往往是通过使用栈来实现的。所以,本表达式求值程序的最主要的数据结构就是栈。可以使用栈来存储输入表达式的操作符和操作数。 输入的表达式是由操作数(又称运算对象)和运算符以及改变运算次序的圆括号连接而成的式子。算术表达式有中缀表示法和后缀表示法,本程序输入的表达式采用中缀表示法,在这种表达式中,二元运算符位于两个操作数中间。 由于不同运算符之间存在优先级,同一优先级的运算间又存在着运算结合顺序的问题,所以简单的从左到右的计算是不充分的。当然凭直观判断一个中缀表达式中哪个运算符最先,哪个次之,哪个最后并不困难,但通过计算机处理就比较困难了。因为计算机只能一个字符一个字符地扫描,要想知道哪个运算符先算,就必须对整个中缀表达式扫描一遍。 而后缀表达式则很容易通过应用栈实现表达式的计算,这为实现表达式求值程序提供了一种直接的计算机制。 2.1后缀表达式设计 后缀表达式是由一系列的运算符、操作数组成的表达式,其中运算符位于两个操作数之后。后缀表达式很容易通过应用栈实现表达式的计算。其基本过程是:当输入一个操作数时,它被压入栈中,当一个运算符出现时,就从栈中弹出适当数量的操作数,对该运算进行计算,计算结果再压回栈中。对于最常见的二元运算符来说,弹出的操作数只有两个。处理完整个后缀表达式之后,栈顶上的元素就是表达式的结果值。整个计算过程不需要理解计算的优先级规则。

实验2 栈和队列的应用-算术表达式求值

1.实验题目 栈和队列的应用 2.实验内容 算术表达式求值 3.实验目的 掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。 4.实验要求 为了更好的掌握与理解课堂上老师所讲的概念与原理,实验前要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)以便在实验课中完成老师所布置的实验内容。 5.概要设计原理 6.详细程序清单及注释说明 #include #include #include #include #define NULL 0 #define OK 1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 /* 定义字符类型栈*/ typedef struct { int stacksize; char *base; char *top; }SqStack; /* ----------------- 全局变量--------------- */ SqStack OPTR,OPND;// 定义运算符栈和操作数栈 char expr[255]; /* 存放表达式串*/ char *ptr=expr; int InitStack(SqStack *s) //构造运算符栈 { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!s->base) exit(OVERFLOW);

s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } char In(char ch) //判断字符是否是运算符,运算符即返回1 { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'); } int Push(SqStack *s,char ch) //运算符栈插入ch为新的栈顶元素{ *s->top=ch; s->top++; return 0; } char Pop(SqStack *s) //删除运算符栈s的栈顶元素,用p返回其值{ char p; s->top--; p=*s->top; return p; } char GetTop(SqStack s)//用p返回运算符栈s的栈顶元素 { char p=*(s.top-1); return p; } /* 判断运算符优先权,返回优先权高的*/ char Precede(char c1,char c2) { int i=0,j=0; static char array[49]={ '>', '>', '<', '<', '<', '>', '>', '>', '>', '<', '<', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '<', '<', '<', '<', '<', '=', '!', '>', '>', '>', '>', '!', '>', '>', '<', '<', '<', '<', '<', '!', '='};

表达式求值

《数据结构(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

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

嘉应学院计算机学院 实验报告 课程名称:数据结构课程设计 开课学期: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)

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

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

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

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

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

c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

目录 题目一.二叉树操作(1)二.算术表达式求 (1) 一、课程设计的目的 (1) 二、课程设计的内容和要求 (1) 三、题目一设计过程 (2) 四、题目二设计过程 (6) 五、设计总结 (17) 六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求 一、课程设计的目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。 (1)题目一的目的: 1、掌握二叉树的概念和性质 2、掌握二叉树的存储结构 3、掌握二叉树的基本操作 (2)题目二的目的: 1、掌握栈的顺序存储结构和链式存储结构 2、掌握栈的先进后出的特点 3、掌握栈的基本运算 二、课程设计的内容和要求 (1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值

三、题目一设计过程 1、题目分析 现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现! 由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现! 2、算法描述 main ( )(主函数) 先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。 void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树) 根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现! int Depth(BiTree T)(求树的深度) 当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

四则运算表达式求值(栈+二叉树,c++版)

HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名:周华毅 学生学号:201308010411 专业班级:计科1304 指导老师:吴帆 完成日期:2015/5/1

一、需求分析 a)四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达 式,并计算结果。 b)本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结 果来求解后缀表达式的值。 c)在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么 在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔 开;如果不正确,在字符界面上输出表达式错误提示。 d)测试数据 输入: 21+23*(12-6) 输出: 21 23 12 6 -*+ 二、概要设计 抽象数据类型 为实现上述程序的功能,应以字符串存储用户的输入,以及计算出的结果。 算法的基本思想 根据题目要求,利用二叉树后序遍历来实现表达式的转换。该算法的基本模块包括二叉树的建立以及如何把输入的中缀表达式利用二叉树后序遍历转化为后缀表达式。 1、首先要将输入的中缀表达式(数字字符)存入到二叉树中,由于存在两位或者两位以上的数,甚至还有小数,所以考虑用字符型指针存储数字字符和操作符。 2、为了便于将中缀表达式存入二叉树中,在录入中缀表达式后,要进行相应的处理,比如去掉空格符,添加结束标志,如‘=’、‘#’等。 3、中缀表达式存入到二叉树的过程中,要注意处理的顺序,如‘+’、‘-’号的优先级比‘*’、‘/’号的低,当遇到‘*’、‘/’号时,要判断树以上的节点中是否有‘+’、‘-’号,有的话要与其交换位置。遇到‘(’时要反复创建二叉树的结点,构建子二叉树,考虑到括号内要处理的步骤可能会较多,可以考虑用递归。遇到‘)’时则直接结束此子二叉树的建立。此外二叉树中叶子结点存储操作数,非叶子结点存储操作码。 4、对创建好的二叉树进行后序遍历,即可得到相应的后缀表达式,实现方法可以用递归的方式,由于后面还要计算表达式的值,故便利的过程中要将结点中得到的数据存入新的字符数组中。 程序的流程 程序由三个模块组成: (1)输入模块:完成一个中缀表达式的输入,存入字符串数组array[Max]中。 (2)计算模块:设计一个建立二叉树的函数,Node* crtTree(Node* root),传入根结点指针,返回根结点指针,该函数的实现还要反复使用另一个函数char getOp(Node *temp),其将数字字符存入一个结点,并返回数字字符的后一 个符号。void deal()函数功能是对字符数组进行处理。void output(Node *root); 函数功能是获得处理后的字符串,也就是中缀表达式转化为的后 缀表达式。 (3)输出模块:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式和表达式的值;如果不正确,在字符界面上输出表达式错误提示。 三、详细设计

用两种方法实现表达式求值

一、设计思想 一.中缀式计算结果的设计思想: 此种算法最主要是用了两个栈:用两个栈来实现算符优先,一个栈用来保存需要计算的数据numStack(操作数栈),一个用来保存计算优先符priStack(操作符栈)。从字符串中获取元素,如果是操作数,则直接进操作数栈,但如果获取的是操作符,则要分情况讨论,如下:(这里讨论优先级时暂不包括“(”和“)”的优先级) 1.如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈; 2.如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且取出操作数栈的栈顶元素m,再取出操作数栈新的栈顶元素n,如果b为+,则用n+m,若为减号,则n-m,依此类推,并将所得结果入操作数栈; 3.如果获取的是“(”,则直接进操作符栈; 4.如果获取的是“)”,则操作符栈的栈顶元素出栈,做类似于情况2的计算,之后把计算结果入操作数栈,再取操作符栈顶元素,如果不是“(”,则出栈,重复操作,直到操作符栈顶元素为“(”,然后“(”出栈; 5.当表达式中的所有元素都入栈后,看操作符栈中是否还有元素,如果有,则做类似于情况2 的计算,并将结果存入操作数栈,则操作数栈中最终的栈顶元素就是所要求的结果。 二.中缀转后缀及对后缀表达式计算的设计思想: 中缀转后缀时主要用了一个操作符栈和一个用来存放后缀表达式的栈,从表达式中依次获取元素,如果获取的是操作数,则直接存入s3栈中,如果获取的是操作符也需分情况讨论,如下:(这里讨论优先级时暂不包括“(”和“)”的优先级) 1. 如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈; 2. 如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且将b存入到操作符栈中; 3.如果获取的是“(”,则直接进操作符栈; 4.如果获取的是“)”,则操作符栈的栈顶元素出栈,并依次存入到操作符栈中,直到操作符栈栈顶元素为“(”,然后将“(”出栈; 5.当表达式中的所有元素都入栈或存入到操作符栈之后,看操作符栈中是否还有元素,如果有,则依次出栈,并且依次存入到操作符栈中,最后打印操作符栈中的字符串,则此字符串即为要求的后缀表达式。 对后缀表达式的计算方法:主要用到了一个操作数栈,从操作符栈中依次取出元素,如果是操作数,则进栈,如果是操作符,则从操作数栈中依次取出两个栈顶元素a1和a2,如果操作符是“/”,则计算a2/a1,将计算结果再次进栈,依此类推,最终栈顶元素即为计算的最终结果。 在这两种算法中,应该特别注意一点:人的习惯,用户在输入表达式时,容易这样输入,如:3*4(3+2),这样是不可取的,应必须要用户输入3*4*(3+2),这是在设计思想上错误提示的很重要一点,否则计算不全面! 二、算法流程图 第一个图是直接计算的流程图,图中反应除了这种方法的大致设计思路,但是有些细节没有反映出来,比如说,怎样把字符型数据转换为浮点型数据,就没有反映出来。特别说明

算术表达式求值系统

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

相关文档
最新文档