⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extree.cpp

📁 一个命令行运算器源代码 用C++写的命令行运算器
💻 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 + -