📄 extree.cpp
字号:
#include "Btree.h"
#include "Extree.h"
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <cmath>
Extree::Extree(char* init):source(init)
{
root = generate();
}
Extree::~Extree()
{
destroy(root);
}
node<Token>* Extree::generate()
{
node<Token> *p,*q;
if((p = getnode()) != NULL)
while((q = getnode()) != NULL)
_insert(p,q);
return p;
}
void Extree::destroy(node<Token>* it)
{
if(it->left)
destroy(it->left);
if(it->right)
destroy(it->right);
delete it;
}
Token Extree::getoken()
{
if((*source >= '0') && (*source <= '9'))
//strtod is used to convert the prefix of the string to
//a double variable and save the postfix pointer to the source
return strtod(source, &source);
else
// is a operator
return *(source++);
}
node<Token>* Extree::getnode()
{
Token p = getoken();
if(p.typ() == Token::OP)
{
if(p.sym() == '(')
return generate();
if(p.sym() == ')' || p.sym() == '\0')
return NULL;
}
return new node<Token>(p);
}
void Extree::_insert(node<Token>*& sub, node<Token>* it)
{
if(it->data.pri() >= sub->data.pri())
sub = insertleft(it, sub);
else
{
node<Token>* pre = sub;
while(it->data.pri() < pre->right->data.pri())
pre = pre->right;
insertright(pre, it);
}
}
//it has not been used in the program
void Extree::insert(const Token& it)
{
_insert(root, new node<Token>(it));
}
double Extree::calculate(node<Token>* sub)
{
if(sub->data.typ() == Token::EX)
return sub->data.num();
double oper1 = calculate(sub->left);
double oper2 = calculate(sub->right);
switch(sub->data.sym())
{
case '+':
return oper1 + oper2;
case '-':
return oper1 - oper2;
case '*':
return oper1 * oper2;
case '/':
return oper1 / oper2;
case '^':
return pow(oper1, oper2);
//could not reach here
default:
std::cerr<<"something wrong..."<<std::endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -