PhoenixZq
分享是一门艺术~~

下面给出一种算法把后缀表达式转变成表达树。一次一个符号地读入表达式,如果符号是操作数,那么就建立一个单结点树并将它推入栈中;如果是操作符那么就从栈中弹出两棵树T1和T2并形成一棵新树,该树的根就是操作符,它的左、右儿子分别是T1和T2。然后将指向这课新树的指针压入栈中。

 

#ifndef STACK_H
#define STACK_H

 

struct BiTreeNode{
char data;
BiTreeNode *left;
BiTreeNode *right;
public:
BiTreeNode(char dat,BiTreeNode *l=0,BiTreeNode *r=0):data(dat),left(l),right(r){}
~BiTreeNode();//
};

class Stack{
struct Link{
BiTreeNode *elem;
Link *next;
Link(BiTreeNode *e,Link *nxt):elem(e),next(nxt){}
~Link(){}
}* head;
public:
Stack():head(0){}
~Stack(){}
void push(BiTreeNode *e);
BiTreeNode* peek();
BiTreeNode* pop();
void midOrderDisplay(BiTreeNode *BT);
};

#endif

#include "Stack.h"
#include <iostream>
using namespace std;
static int count = 0;
////////////////////////////////////
void Stack::push(BiTreeNode *dat){
head = new Link(dat,head);
}
////////////////////////////////////
BiTreeNode* Stack::peek(){
if(head == 0) return 0;
return head->elem;
}
////////////////////////////////////
BiTreeNode* Stack::pop(){
if(head == 0) return 0;
BiTreeNode* result = head->elem;
Link *oldHead = head;
head = head->next;
delete oldHead;
return result;
}
////////////////////////////////////
//中序遍历
void Stack::midOrderDisplay(BiTreeNode *BT){
if(BT){
midOrderDisplay(BT->left);
cout << BT->data << " ";
midOrderDisplay(BT->right);
}
}
////////////////////////////////////
int main(){
Stack sk;
char dt;
while(dt != '#'){
cout << "Please input data: " ;
cin >> dt;
cout << endl;
BiTreeNode *btn = new BiTreeNode(dt,0,0);
if(dt != '+'&&dt != '-'&&dt != '*'&&dt != '/')
//if(btn->data != 10000)
sk.push(btn);
else{
BiTreeNode *l,*r;
l = sk.pop();
r = sk.pop();
btn->left = r;
btn->right = l;
sk.push(btn);
}
}
sk.pop();
cout << "Print the Tree :" << endl;
sk.midOrderDisplay(sk.peek());
return 0;
}

 

posted on 2010-12-03 22:20  PhoenixZq  阅读(394)  评论(0编辑  收藏  举报