表达式二叉树·实验代码

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

实验:表达式二叉树

实验要求:

建立表达式二叉树,并打印(可逆时针旋转90度打印,也可尝试正向打印)

以中缀表达式a*b+(c-d)/e-f 为例,建立以"-"号为根的表达式二叉树。

提示:若直接利用中缀表达式建立困难,可先将中缀表达式转化为后缀表达式(可利用栈中的中缀到后缀转化程序实现中缀表达式到后缀表达式的转换,再根据后缀表达式建立表达式二叉树,可参考栈中后缀表达式计算方法)。

实验代码:

#include

#include

#include

#include

#include

using namespace std;

class tnode;

void buildexptree(const string &exp);

void printexptree();

int judgerank(char ch);

bool isoperator(char ch);

void test();

void setxy(tnode *tn, int y);

int X = 0;

int Y = 0;

int depth = 0;

vectorvt;

class tnode{

public:

char nodeValue;

int x, y;

tnode *left;

tnode *right;

tnode(){

x = 0;

y = 0;

}

tnode(char &item, tnode *lptr = NULL, tnode *rptr = NULL):

nodeV alue(item), left(lptr), right(rptr){

x = 0;

y = 0;

}

};

tnode *myNode;

bool cmp(tnode *t1, tnode *t2){

if(t1->y != t2->y)

return (t1->y) > (t2->y);

return (t1->x) < (t2->x);

}

class zpair{ //将operator和rank打包为一体,临时存储在stk2中public:

char op;

int rank;

zpair(){}

zpair(char _op, int _rank){

op = _op;

rank = _rank;

}

};

int judgerank(char ch){

if(ch == '(') return -1;

if(ch == '+' || ch == '-') return 1;

if(ch == '*' || ch == '/') return 2;

return 0;

}

bool isoperator(char ch){

if(ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '*' || ch == '/') return true;

else

return false;

}

void buildexptree(const string &exp){

stackstk1;

stackstk2;

int i;

int len = exp.length();

char ch;

zpair tz;

zpair ztop;

for(i=0; i

ch = exp[i];

if(!isoperator(ch)){ //exp[i] is an operand, so create a tnode using exp[i] and push to stk1

tnode *ptr1 = new tnode(ch);

stk1.push(ptr1);

}

else {

tz.op = ch;

tz.rank = judgerank(ch);

if(stk2.empty())

stk2.push(tz);

else if(ch == '(')

stk2.push(tz);

else if(ch == ')'){

ztop = stk2.top();

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

tnode *ptr2 = stk1.top();

stk1.pop();

tnode *ptr3 = stk1.top();

stk1.pop();

tnode *ptr4 = new tnode(ztop.op, ptr3, ptr2);

stk1.push(ptr4);

stk2.pop();

ztop = stk2.top();

}

stk2.pop();

}

else{

ztop = stk2.top();

while(tz.rank <= ztop.rank){

tnode *ptr5 = stk1.top();

stk1.pop();

tnode *ptr6 = stk1.top();

stk1.pop();

tnode *ptr7 = new tnode(ztop.op, ptr6, ptr5);

stk1.push(ptr7);

stk2.pop();

if(stk2.empty()) break;

else ztop = stk2.top();

}

stk2.push(tz);

}

}

}

while(!stk2.empty()){

tnode *ptr8 = stk1.top();

stk1.pop();

tnode *ptr9 = stk1.top();

stk1.pop();

tnode *ptr10 = new tnode(stk2.top().op, ptr9, ptr8);

stk1.push(ptr10);

stk2.pop();

}

myNode = stk1.top();

}

int main(){

freopen("chris.txt","r",stdin);

string exp;

cout << "Please input an expression:" << endl;

cin >> exp;

buildexptree(exp);

cout << "The expression tree is: " << endl;

printexptree();

return 0;

}

相关文档
最新文档