数据结构实验报告——四则运算表达式求值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五四则运算表达式求值

一.问题描述:

四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。

二.基本要求:

使用二叉树来实现。

三.实现提示:

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

输入输出格式:

输入:在字符界面上输入一个中缀表达式,回车表示结束。

输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

测试实例:

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

输出:21 23 12 6 -*+

四.设计概要

用二叉树表示表达式:若表达式为数或简单变量,则相应二叉树中仅有一个根结

点,其数据域存放该表达式信息若表达式= (第一操作数)(运算符)(第二操作数),则相应的二叉树中以左子树表示第一操作数,右子树表示第二操作数,根结点的数据域存放运算符(若为一元算符,则左子树空)。操作数本身又为表达式.后缀遍历二叉树码实现和静态检查上机调试及测试数据的调试

五.源程序:

#include

#include

#include

#include

#include

#include

#define STACK_INIT_SIZE 100

#define DATA_SIZE 10

#define STACKINCREMENT 10

#define OK 1

#define TRUE 1

#define FALSE 0

#define ERROR 0

#define OVERFLOW -2

using namespace std;

typedef float SElemtype;

typedef int Status;

typedef char * TElemType;

typedef struct BiTNode {

TElemType data;

int len; //data字符串中字符的个数struct BiTNode * lchild, * rchild;

}BiTNode, *BiTree;

typedef struct

{

SElemtype *base;

SElemtype *top;

int stacksize;

} SqStack;

Status IsDigital(char ch)

if(ch>='0'&&ch<='9')

{

return 1; //是数字字母

}

return 0; //不是数字字母

}

int CrtNode(stack &PTR, char *c)

{

BiTNode * T;

int i=0;

T = (BiTNode *)malloc(sizeof(BiTNode));

T->data = (char *)malloc(DATA_SIZE*sizeof(char));

while(IsDigital(c[i]))

{

T->data [i] = c[i];

i++;

}

T->len = i;

T->lchild = T->rchild = NULL;

PTR.push (T);

return i;

}

void CrtSubTree(stack &PTR, char c)

{

BiTNode * T;

T = (BiTNode *)malloc(sizeof(BiTNode));

T->data = (char *)malloc(DATA_SIZE*sizeof(char));

T->data [0] = c;

T->len = 1;

T->rchild = PTR.top(); //先右子树,否则运算次序反了PTR.pop ();

T->lchild = PTR.top();

PTR.pop ();

PTR.push (T);

}

char symbol[5][5]={{'>', '>', '<', '<', '>'}, //符号优先级

{'>', '>', '<', '<', '>'},

{'>', '>', '>', '>', '>'},

{'>', '>', '>', '>', '>'},

{'<', '<', '<', '<', '='}};

int sym2num(char s) //返回符号对应优先级矩阵位置

{

switch(s)

{

case '+': return 0; break;

case '-': return 1; break;

case '*': return 2; break;

case '/': return 3; break;

case '#': return 4; break;

}

}

char Precede(char a, char b) //返回符号优先级

{

return(symbol[sym2num(a)][sym2num(b)]);

相关文档
最新文档