四则运算表达式求值
四则运算(五大定律)及公式

四则混合运算加法、减法、乘法、除法,统称为四则运算。
其中,加法和减法叫做第一级运算;乘法和除法叫做第二级运算四则混合运算运算顺序:同级运算时,从左到右依次计算;两级运算时,先算乘除,后算加减。
有括号时,先算括号里面的,再算括号外面的;有多层括号时,先算小括号里的,再算中括号里面的,,再算大括号里面的,最后算括号外面的。
要是有乘方,最先算乘方。
在混合运算中,先算括号内的数,括号从小到大,如有乘方先算乘方,然后从高级到低级。
四则混合运算表示方法编辑四则混合运算脱式计算脱式计算即递等式计算,把计算过程完整写出来的运算,也就是脱离竖式的计算。
在计算混合运算时,通常是一步计算一个算式(逐步计算,等号不能写在原式上),要写出每一步的过程。
一般来说,等号要往前,不与第一行对齐。
示例:1+2×(4-3)÷5×[(7-6)÷8×9]=1+2×1÷5×[1÷8×9]=1+2÷5×[0.125×9]=1+0.4×1.125=1+0.45=1.45四则混合运算横式计算示例:1+2×(4-3)÷5×[(7-6)÷8×9]=1+2×1÷5×[1÷8×9]=1+2÷5×[0.125×9]=1+0.4×1.125=1+0.45=1.45四则运算 (五大定律)(一)加法运算定律:字母公式:a+b=b+a2、先把前两个数相加,或者先把后两个数相加,和不变,这叫做---加法结合律。
字母公式:(a+b) +c=a+(b+c)(二)乘法运算定律:字母公式:a×b=b×a字母公式:(a×b)×c=a×(b×c)3、两个数的和与一个数相乘,可以先把它们与这个数分别相乘,再相加,这叫做---乘法分配律。
四则运算的法则

四则运算的法则四则运算是数学中最基本的运算之一,包括加法、减法、乘法和除法。
这些运算法则在我们日常生活中随处可见,无论是在购物、做饭还是在工作中,我们都会用到四则运算。
在数学中,四则运算有一定的运算法则,下面我们来详细了解一下。
一、加法。
加法是最简单的运算之一,它是将两个或多个数相加得到一个和的过程。
在加法中,有一些基本的法则需要遵循:1. 加法交换律,a + b = b + a。
这意味着加法中的加数的顺序不影响结果,无论先加哪个数,最终的和都是相同的。
2. 加法结合律,(a + b) + c = a + (b + c)。
这意味着在多个数相加时,可以任意改变加法的顺序,最终的和都是相同的。
3. 加法单位元素,对于任意数a,都有a + 0 = a。
这意味着任何数和0相加都等于它自身。
二、减法。
减法是将一个数减去另一个数得到差的过程。
在减法中也有一些基本的法则需要遵循:1. 减法的定义,a b = a + (-b)。
这意味着减法可以转化为加法,其中-b称为a的相反数。
2. 减法的性质,a a = 0。
这意味着任何数减去它自身都等于0。
三、乘法。
乘法是将两个或多个数相乘得到积的过程。
在乘法中也有一些基本的法则需要遵循:1. 乘法交换律,a b = b a。
这意味着乘法中的乘数的顺序不影响结果,无论先乘哪个数,最终的积都是相同的。
2. 乘法结合律,(a b) c = a (b c)。
这意味着在多个数相乘时,可以任意改变乘法的顺序,最终的积都是相同的。
3. 乘法单位元素,对于任意数a,都有a 1 = a。
这意味着任何数和1相乘都等于它自身。
四、除法。
除法是将一个数除以另一个数得到商的过程。
在除法中也有一些基本的法则需要遵循:1. 除法的定义,a / b = c,其中a为被除数,b为除数,c为商。
这意味着除法是乘法的逆运算。
2. 除法的性质,a / a = 1。
这意味着任何数除以它自身都等于1。
总结起来,四则运算的法则是数学中最基本的运算法则,它们贯穿于我们日常生活的方方面面。
数字的四则运算知识点总结

数字的四则运算知识点总结在数学中,四则运算是最基础、最常见的运算方法,包括加法、减法、乘法和除法。
掌握四则运算的知识点是进行数学计算和解决实际问题的基础。
下面将对四则运算的知识点进行总结。
一、加法运算加法是指将两个或多个数值相加的运算。
在加法运算中,可以遵循以下几个知识点:1. 加法交换律:a + b = b + a。
即加法运算中,两个数值的顺序不影响结果。
2. 加法结合律:(a + b) + c = a + (b + c)。
即多个数值相加的顺序不影响结果。
二、减法运算减法是指将一个数值从另一个数值中减去的运算。
在减法运算中,可以遵循以下几个知识点:1. 减法的定义:a - b 表示从 a 中减去 b,得到的差值。
2. 减法的相反数:a - b = a + (-b)。
即减去一个数值可以转化为加上该数值的相反数。
三、乘法运算乘法是指将两个数值相乘的运算。
在乘法运算中,可以遵循以下几个知识点:1. 乘法交换律:a * b = b * a。
即乘法运算中,两个数值的顺序不影响结果。
2. 乘法结合律:(a * b) * c = a * (b * c)。
即多个数值相乘的顺序不影响结果。
3. 乘法分配律:a * (b + c) = a * b + a * c。
即乘法对加法的分配性质。
四、除法运算除法是指将一个数值除以另一个数值的运算。
在除法运算中,可以遵循以下几个知识点:1. 除法的定义:a ÷ b 表示将 a 分成 b 份,得到的每份的数量。
2. 除法的相反数:a ÷ b = a * (1/b)。
即除以一个数可以转化为乘以该数的倒数。
3. 除数不为零:除数不能为零,即b ≠ 0。
综合运用四则运算的知识点,可以进行复杂的数值计算。
同时,还需要注意运算的优先级问题,一般按照“括号、指数、乘除、加减”的顺序进行计算。
例如,遇到括号先计算括号内的运算,然后再进行指数运算,接着进行乘除运算,最后进行加减运算。
实验4四则运算表达式求值

实验4四则运算表达式求值.黄栋软件2班201326010226背景在工资管理软件中,不可避免的要用到公式的定义及求值等问题。
对于数学表达式的计算,虽然可以直接对表达式进行扫描并按照优先级逐步计算,但也可以将中缀表达式转换为逆波兰表达式,这样更容易处理。
问题描述四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
基本要求(1)使用二叉树来实现。
实现提示利用二叉树后序遍历来实现表达式的转换,同时可以使用栈来求解后缀表达式的值。
输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。
输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式和计算结果,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+result is 159一.需求分析:1. 本程序是利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值。
2.输入输出格式:输入格式:在字符界面上输入一个中缀表达式,回车表示结束。
请输入表达式:输入一个中缀表达式输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
逆波兰表达式为:输出逆波兰表达式运算结果为:输出运算后的结果3.测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+二.概要设计堆栈的ADT:对于ADT Stack模板:物理数据类型采用数组template<class T>class Stack{ --申明堆栈及其基本操作public:Stack(int size=0);//构造大小为size的堆栈~Stack(){delete p;}//撤销堆栈bool IsFull(){return top==Size;}//判断堆栈是否已满bool IsEmpty(){return top==0;}//判断堆栈是否为空void Push(T &x);//将x压入堆栈T Pop(T &x);//将栈顶元素弹出用x保存private:int Size;//大小int top;//栈顶T *p;//数组指针};二叉树的ADTtypedef struct BiTNode {TElemType data;int len;struct BiTNode * lchild, * rchild;}BiTNode, *BiTree;算法的基本思想1)以二叉链表的存储结构创建一棵树。
四则运算及公式

四则运算及公式四则运算是数学中最基本的运算方法之一,包括加法、减法、乘法和除法。
这些运算符可以通过一些基本定律来简化计算过程。
下面将介绍四则运算的五大定律,并附上相关的公式。
1.加法的交换律:a+b=b+a两个数相加的结果与加法的顺序无关。
2.加法的结合律:(a+b)+c=a+(b+c)三个数相加时,可以先计算前两个数的和,然后再与第三个数相加,结果不变。
3.减法的化为加法:a-b=a+(-b)减法可以转化为加法,将被减数加上减数的相反数即可。
4.乘法的交换律:a*b=b*a两个数相乘的结果与乘法的顺序无关。
5.乘法的结合律:(a*b)*c=a*(b*c)三个数相乘时,可以先计算前两个数的乘积,然后再与第三个数相乘,结果不变。
公式:1.加法公式:(a + b) ^ 2 = a^2 + 2ab + b^2(a - b) ^ 2 = a^2 - 2ab + b^2这些公式在平方和差的情况下使用,可以简化计算。
2.乘法公式:(a + b) * (c + d) = ac + ad + bc + bd这个公式用于计算两个括号中的表达式相乘时的结果。
3.除法公式:a/b=ca=c*b这个公式用于计算除法的结果,将被除数除以除数得到商。
四则运算的五大定律和相关公式非常重要,我们在解各种数学问题时经常需要用到它们。
通过熟练地掌握这些定律和公式,可以更高效地进行计算,并且可以优化运算的顺序,减少出错的可能性。
总结起来,四则运算的五大定律是加法的交换律、加法的结合律、减法的化为加法、乘法的交换律和乘法的结合律。
同时,还有一些常用的公式如加法公式、乘法公式和除法公式。
在实际运算中,这些定律和公式可以大大简化计算过程,提高计算效率。
数与式的计算数与式的四则运算化简与求值

数与式的计算数与式的四则运算化简与求值数与式的计算——数与式的四则运算化简与求值在数学中,计算是一种重要的技能,它涉及数与式的四则运算、化简和求值。
了解和掌握这些技巧对于解决数学问题非常关键。
本文将介绍数与式的四则运算、化简与求值方法。
1. 加法加法是计算中最基础的运算之一。
当我们计算两个数的和时,只需要把它们相加即可。
例如,计算5加3,结果为8。
如果要计算更复杂的式子,比如2加3再减去4,我们需要遵循计算的顺序,先计算加法,再计算减法。
所以,2加3再减去4的结果为1。
2. 减法减法是计算中常用的运算之一。
计算减法时,我们需要明确被减数和减数的顺序。
例如,计算7减去3,结果为4。
和加法一样,如果要计算复杂的式子,比如12减去7再加上5,我们需要按照顺序进行运算,先计算减法,再计算加法。
所以,12减去7再加上5的结果为10。
3. 乘法乘法是计算中常用的运算之一。
当我们计算两个数的乘积时,只需要把它们相乘即可。
例如,计算2乘以3,结果为6。
如果要计算更复杂的式子,比如2乘以3再加上4,我们需要按照计算的顺序,先计算乘法,再计算加法。
所以,2乘以3再加上4的结果为10。
4. 除法除法是计算中常用的运算之一。
计算除法时,我们需要明确被除数和除数的顺序。
例如,计算12除以3,结果为4。
和前面介绍的运算一样,如果要计算更复杂的式子,比如12除以3再加上2,我们需要按照顺序进行运算,先计算除法,再计算加法。
所以,12除以3再加上2的结果为6。
5. 化简与求值为了简化数与式,我们可以进行合并或分解。
合并是将同类项相加或相乘,分解是将一个式子拆分成多个简单的式子。
例如,化简式子3乘以(2加1)可以得到3乘以3,结果为9。
求值是指用具体的数代入变量,计算得到数与式的具体结果。
例如,求值式子2乘以x,其中x的取值为3,则结果为6。
通过四则运算的化简与求值,我们能够更好地理解和解决数学问题。
无论是简单的计算还是复杂的算式,我们都可以根据运算规则和顺序来准确地计算。
实验3四则运算表达式求值

四则运算表达式求值学生姓名:陈旸浩学生学号:20110807220专业班级:智能科学与技术2班指导老师:骆嘉伟实验5四则运算表达式求值一、需求分析:1.本程序是利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值。
2.输入:在字符界面上输入一个中缀表达式,回车表示结束。
3.输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
4.测试数据输入:21+23*(12-6)输出:21 23 12 6 -*+运算结果为:149二、概要设计抽象数据类型为实现上述程序的功能,应以二叉树类BiTree存储用户的输入,以及计算出的结果。
算法的基本思想根据题目要求,利用栈计算,和二叉树存储,来计算表达式。
该算法的基本思想是:先利用栈进行计算,然后用二叉树进行存储,和实验三算法一样来计算逆波兰表达式的值。
程序的流程程序由三个模块组成:(1)输入模块:输入一个运算式(2)计算模块:利用栈进行表达式的计算,二叉树来存储。
(3 )输出模块:屏幕上显示出后缀表达式和运算结果。
三、详细设计物理数据类型用二叉树表示表达式:若表达式为数或简单变量,则相应二叉树中仅有一个根结点,其数据域存放该表达式信息;若表达式=(第一操作数)(运算符)(第二操作数),则相应的二叉树中以左子树表示第一操作数,右子树表示第二操作数,根结点的数据域存放运算符(若为一元算符,则左子树空)。
操作数本身又为表达式。
算法的具体步骤中序表达式转后序表达式*houxu(char *infix):从左到右遍历中序表达式的每一数字和符号,若是数字就输出,即成为后序表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后序表达式为止。
后序表达式计算结果qiuzhi(char *postfix):从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
四则运算表达式求值

一、需求分析利用二叉树后序遍历来实现表达式的转换,同时可以使用实验3的结果来求解后缀表达式的值。
输入:在字符界面上输入一个中缀表达式,回车表示结束。
输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
二、概要设计抽象数据类型二叉树类BiTree算法的基本思想利用栈计算,和二叉树存储,来计算表达式程序的流程程序由三个模块组成:(1)输入模块:输入一个运算式,计算模块、输出模块:显示后缀表达式以及结果三、详细设计物理数据类型程序含有两个类,其中栈不再赘述,另一个类为二叉树class BiTree包含私有成员struct BiTreeNode,根节点BiTreeNode *T;索引index; int number_of_point 优先级比较函数compare(char a,char b);生成树的函数void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end);判断数字函数bool IsNumber(char a);求值函数double Operate(BiTreeNode *T);还有显示后缀表达式的函数void display(BiTreeNode *T) ;而公有成员函数则是对私有函数的重载,为方便使用,因为函数中普遍使用了递归的算法,四、输入和输出的格式和测试结果五、代码#include <iostream>#include <string.h>using namespace std;#define SIZE 100#define STACKINCREMENT 10template<class T>class stack{public:void InitStack();void DestroyStack();void ClearStack();bool StackEmpty();int StackLength();bool GetTop(T &t);void Push(T t);bool Pop(T &t);private:struct SqStack{T *base;T *top;int stacksize;}S;};template<class T>void stack<T>::InitStack() {S.base = (T *)malloc(SIZE * sizeof(T));if(!S.base) exit(0);S.top = S.base;S.stacksize = SIZE;}template <class T>void stack<T>::DestroyStack(){free(S.base);}template <class T>void stack<T>::ClearStack(){S.top = S.base;}template <class T>bool stack<T>::StackEmpty(){if(S.top == S.base) return true;else return false;}template <class T>int stack<T>::StackLength(){return (S.top - S.base);}template <class T>bool stack<T>::GetTop(T &t){if(S.top != S.base){t = *(S.top - 1);return true;}else return false;}template <class T>void stack<T>::Push(T t){if(S.top - S.base >= S.stacksize){S.base = (T *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(T));if(!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = t;S.top++ ;}template <class T>bool stack<T>::Pop(T &t){if(S.top == S.base) return false;Else S.top-- ;t = *S.top ;return true;}class BiTree{private:struct BiTreeNode{char OPT[10];BiTreeNode *lchild,*rchild;};BiTreeNode *T; //T是根结点int index; //index是后缀表达式转换二叉树时的索引int number_of_point ;void DestroyTree(BiTreeNode *T); //销毁一颗树void DestroyTree();int compare(char a,char b); //定义了任意两个运算符的优先级/*递归构造中缀表达式转化为的二叉树(利用栈)*/void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end);bool IsNumber(char a); //判断一个字符是否为数值形式的double Operate(BiTreeNode *T); //递归求解树表示的表达式的值void display(BiTreeNode *T) ;public:BiTree() {T = NULL ;index = 0 ;number_of_point = 0 ;}/*以下两个函数重载私有成员函数方便计算*/void InorderCreate();double Operate();void display() ;~BiTree() {DestroyTree() ;}};void BiTree::InorderCreate(){char OPT[30][10];cout << "输入中缀表达式: " << endl;char c = getchar();bool flag = true;int i = 0,j = 0 ;while(c != 10) { //输入的是空格j = 0;if(c == '-' && flag == true) { //flag判断是否是一个负数的值OPT[i][j++] = c;for(c = getchar() ; IsNumber(c) ; c = getchar() )OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else if(IsNumber(c)){OPT[i][j++] = c;for(c = getchar();IsNumber(c);c = getchar())OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else //运算符时的处理{flag = true;OPT[i][j++] = c;OPT[i++][j] = '\0';c = getchar();}}InorderCreate(T,OPT,0,i-1);}//递归构造start,end分别是一个式子开始值和结束值的索引void BiTree::InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end) { if(start == end) { //递归终止if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);strcpy(T->OPT,str[start]);T->lchild = NULL;T->rchild = NULL;}else{stack<char> opt;stack<int> num;num.InitStack();opt.InitStack();char last;int index;int a;bool jump = false;for(int i = start;i <= end;i++) { //begin求解优先级最小的一个运算符if(jump) break;number_of_point = 0 ;if(IsNumber(str[i][0]) || str[i][0] == '-' && IsNumber(str[i][1]) )continue;else{char c = str[i][0];char b;if(i == start && c == '(') {start += 1;continue;}else if(opt.StackEmpty() || (opt.GetTop(b) && compare(b,c) == -1)){opt.Push(c);num.Push(i);}else{if(c != ')'){opt.Pop(b);num.Pop(a);if(!opt.StackEmpty()){opt.GetTop(b);if(compare(b,c) == 1){opt.Pop(b);num.Pop(a);opt.Push(c);num.Push(i);}else{opt.Push(c);num.Push(i);}}else{opt.Push(c);num.Push(i);}}else{for(opt.GetTop(b);compare(b,c) != 0;opt.GetTop(b)){opt.Pop(b);num.Pop(a);if(opt.StackEmpty()){opt.Push(b);num.Push(a);end -= 1;jump = true;break;}}if(compare(b,c) == 0) {opt.Pop(b);num.Pop(a);}}}}} //end,得到的是该步中的根结点字符last及其索引indexopt.Pop(last);num.Pop(index);if(!opt.StackEmpty()){opt.Pop(last);num.Pop(index);}opt.DestroyStack();num.DestroyStack();if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);T->OPT[0] = last;T->OPT[1] = '\0';InorderCreate(T->rchild,str,start,index-1);InorderCreate(T->lchild,str,index+1,end);}}int BiTree::compare(char a,char b){ //1表示栈顶优先级高于待入栈的元素if(a == '(' && b == ')') return 0;else if((a == '+' && b == '*') || (a == '+' && b == '/')|| (a == '-' && b == '*') || (a == '-' && b == '/')|| (a != ')' && b == '(') || (a == '(' && b != ')'))return -1;else return 1;}bool BiTree::IsNumber(char a){if( a == '.' && number_of_point == 0 ) {number_of_point ++ ;return true;}else if('0' <= a && a <= '9') return true ;else return false;}double BiTree::Operate(BiTreeNode *T){if(T->lchild==NULL && T->rchild==NULL){double num = atof(T->OPT); //调用系统函数atof()将字符串转换为浮点数return num;}double ld,rd;ld = Operate(T->lchild);rd = Operate(T->rchild);char c = T->OPT[0];switch(c){case '+': return ld+rd;break;case '-': return rd-ld;break;case '*': return ld*rd;break;case '/': return rd/ld;break;default:cout << " you have entered wrong data ! "<< endl ;return 0;break ;}}double BiTree::Operate(){return Operate(T);}void BiTree::display(BiTreeNode *T){if(T == NULL ) return ;display(T->rchild);display(T->lchild);cout << T->OPT << " " ;}void BiTree::display(){display(T) ;}void BiTree::DestroyTree(BiTreeNode *T){if(T){DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);}}void BiTree::DestroyTree(){DestroyTree(T);}int main(){BiTree tree;tree.InorderCreate();cout << endl << tree.Operate() << endl;tree.display() ;cout << endl ;return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、需求分析1.程序说明:本程序利用二叉树的后序遍历实现表达式的转换,同时可以使用本程序的结果求解后缀表达式的值2.输入输出的形式:输入:21+23*(12-6)输出:21 23 12 6 -*+计算结果为:1593.输入输出范围:程序仅计算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 >|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; //设置当前位序,若表空,返回falseElem 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 elementvoid setVal(const Elem&) = 0; // Set the node's elementBinNode* left() const = 0; // Return the node's left childvoid setLeft(BinNode*) = 0; // Set the node's left childBinNode* right() const = 0; // Return the node's right childvoid setRight(BinNode*) = 0; // Set the node's right childbool isLeaf() = 0; // Return true iff the node is a leaf}//栈ADTADT of stack{数据对象D:D={ a i | a i ∈ElemSet, i=1,2,...,n, n≥0 }数据关系R:R1={ <a i-1, a i >| a i-1, a i∈D, i=2,...,n }约定a n端为栈顶,a1 端为栈底基本操作M:// Reinitialize the stackvoid 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 stackbool topValue(Elem&) const = 0;// Return the number of elements in the stack.int length() const = 0;}//二叉树ADTADT of BTree{数据对象D:D是具有相同特性的数据元素的集合数据关系R:若D为空集,则称为空树。
否则:(1) 在D中存在唯一的称为根的数据元素root;(2) 当n>1时,其余结点可分为不相交的有限集T l、 T r,其中每一个子集本身又是一棵符合本定义的二叉树,称为根root的子树基本操作M:Btree( BTNode<Elem>* r = nullptr ); //构造树~Btree(); //析构树void CreatTree(List<char> str); //将表达式以树的形式存储 void PosOrder(List<char> str); //用str返回后缀表达式,}算法的基本思想获取四则运算表达式,将四则运算表达式存储至一颗二叉树,通过二叉树的基本操得到到四则运算表达式的后缀表达式,输出后缀表达式,计算后缀表达式结果并输出程序模块输入模块:获取输入,并将表达式临时存储至线性表存储模块:将表达式序列存储至二叉树中处理模块:得到后缀表达式,计算后缀表达式输出模块:输出后缀表达式以及计算结果三:详细设计由于输入的表达式长度不确定,所以采用链式,实现用于临时存储表达式序列的线性表采用链式,实现二叉树采用链式,实现栈物理数据类型//BTreeNode基本操作实现template <class Elem>class BinNodePtr : public BinNode<Elem>{private:Elem it; // The node's valueBinNodePtr* lc; // Pointer to left childBinNodePtr* rc; // Pointer to right childpublic: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<Elem>* left() const{ return lc; }void setLeft(BinNode<Elem>* b){ lc = (BinNodePtr*)b; }inline BinNode<Elem>* right() const{ return rc; }void setRight(BinNode<Elem>* 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<char> 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 functionint calc(LList<char>* str) //计算后缀表达式的伪代码{LStack<int> num;int num1,num2,value;int length = str.length();for(int i=0;i<length;++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。