二叉树表达式计算(2)

/*学号:2014329620069  姓名:张卓鹏 班级:14计科2*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<sstream>
using namespace std;

typedef struct tree{
    string data;
    tree *lchild;
    tree *rchild;
}Bitree, *pBitree;

stack<string>sta1;
stack<string>sta2;

int turn_str(char s[], string str[])//将计算表达式储存在string类中。方便以后将数字从字符型转换成数据

{

int i, j = 0, k = 0, count = 0;

for (i = 0; s[i] != ‘\0‘; i++)
    {
        if ((s[i] == ‘+‘) || (s[i] == ‘/‘) || (s[i] == ‘*‘) || (s[i] == ‘-‘) || (s[i] == ‘(‘) || (s[i] == ‘)‘))
        {
            str[j] += s[i];
        }
        else
        {
            for (; s[i] != ‘+‘ && s[i] != ‘-‘ &&s[i] != ‘*‘ &&s[i] != ‘/‘ &&s[i] != ‘)‘&& i < strlen(s); i++)
            {
                str[j] += s[i];
            }
            i--;
        }
        j++;
        count++;
    }
    return count;
}
int judge(string str)
{
    string s;
    s = sta2.top();
    if (str == "+" || str == "-"){
        if (s == "+" || s == "-" || s == "*" || s == "/")
            return 1;
        else
            return 0;

}
    else if (str == "*" || str == "/")
    {
        if (s == "*" || s == "/")
            return 1;
        else
            return 0;
    }

}
void turn_postorder(string str[], int count)    //变为后缀表达式
{
    string temp;

for (int i = 0; i <count; i++)
    {
        if (str[i] == "+" || str[i] == "-" || str[i] == "*" || str[i] == "/")
        {
            while (!sta2.empty() && judge(str[i]))
            {
                temp += sta2.top();
                sta1.push(temp);
                sta2.pop();
                temp = "";
            }
            sta2.push(str[i]);
        }
        else if (str[i] == "(")
        {
            sta2.push(str[i]);
        }
        else if (str[i] == ")")
        {
            while ((temp += sta2.top()) != "(")
            {
                sta1.push(temp);
                sta2.pop();
                temp = "";
            }
            sta2.pop();
        }
        else
        {
            sta1.push(str[i]);
        }

temp = "";
    }

while (!sta2.empty())
    {
        temp += sta2.top();
        sta2.pop();
        sta1.push(temp);
        temp = "";
    }

/*while (!sta1.empty())        //测试栈中的数据
    {
    temp += sta1.top();
    cout<<temp<<endl;
    sta1.pop();
    temp = "";
    }*/
}
void creat_tree(pBitree &root)            //通过后序表达式建树
{
    string temp;
    if (!sta1.empty())
    {
        temp += sta1.top();
        sta1.pop();
    }
    root = new Bitree;
    root->data += temp;
    if (temp != "+" && temp != "-"  &&  temp != "*"  &&  temp != "/")
    {
        root->rchild = NULL;
        root->lchild = NULL;
        return;
    }
    else
    {
        creat_tree(root->rchild);
        creat_tree(root->lchild);
    }

}
void preorder(pBitree root)
{
    if (root != NULL)
    {
        cout << root->data << "    ";
        preorder(root->lchild);
        preorder(root->rchild);
    }

}
void postorder(pBitree T)        //后序遍历   递归
{

if (T)
    {
        postorder(T->lchild);
        postorder(T->rchild);
        cout << T->data << "    ";

}

}
void inorder(pBitree T)        //中序遍历  递归
{
    if (T)
    {
        inorder(T->lchild);
        cout << T->data << "    ";
        inorder(T->rchild);
    }

}
double str_turn_double(string str)        //字符串转为double
{
    int i = 0, flag = 0, c = 1;
    double n = 0;
    while (str[i] != ‘\0‘)
    {
        if (str[i] != ‘.‘ && flag == 0)
            n = n * 10 + (str[i] - ‘0‘);
        else
        {
            if (flag == 0)
            {
                i++;
                n = n + (str[i] - ‘0‘)*pow(0.1, c);
            }
            else
            {
                n = n + (str[i] - ‘0‘)*pow(0.1, c);
            }
            c++;
            flag++;
        }
        i++;
    }
    return n;
}
string double_turn_str(double d) {            //double转为string
    ostringstream os;
    if (os << d)
        return os.str();
}
string result(pBitree root)            //从树中计算表达式的值
{
    string num1, num2;
    double n1, n2;
    if (root->data == "+"){
        num1 = result(root->lchild);
        n1 = str_turn_double(num1);
        num2 = result(root->rchild);
        n2 = str_turn_double(num2);
        root->data = double_turn_str(n1 + n2);
    }
    else if (root->data == "-"){
        num1 = result(root->lchild);
        n1 = str_turn_double(num1);
        num2 = result(root->rchild);
        n2 = str_turn_double(num2);
        root->data = double_turn_str(n1 - n2);
    }
    else if (root->data == "*"){
        num1 = result(root->lchild);
        n1 = str_turn_double(num1);
        num2 = result(root->rchild);
        n2 = str_turn_double(num2);
        root->data = double_turn_str(n1 * n2);
    }
    else if(root->data =="/") {
        num1 = result(root->lchild);
        n1 = str_turn_double(num1);
        num2 = result(root->rchild);
        n2 = str_turn_double(num2);
        root->data = double_turn_str(n1 / n2);
    }
    return root->data;
}
int main()
{
    int count;
    char s[50];
    string res;
    double r;
    pBitree root = NULL;
    string str[30];

printf("请输入表达式:");
        scanf("%s", &s);
        count = turn_str(s, str);

turn_postorder(str, count);

creat_tree(root);

preorder(root);
        printf("以上先序遍历\n");

inorder(root);
        printf("以上中序遍历\n");

postorder(root);
        printf("以上后序遍历\n");

printf("结果:");

res=result(root);

cout << res << endl;

system("pause");
    return 0;
}

//(5-1)*9+6*9-5-3
//(5-7)*(9-7)-1
//(5-1)-1
//(99.3+44.23)*93/34+9

时间: 2024-10-24 07:08:42

二叉树表达式计算(2)的相关文章

C# - 二叉树表达式计算

很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深嘛. 我喜欢逆过来贴代码~ 这是运行结果: cal() 是节点类里的计算方法,从根节点调用,递归所有子节点进行计算.Left,Right分别是左右子节点. 1 public double cal() 2 { 3 if (this.isDig==false) 4 { 5 return CAL(Fuha

表达式计算

1 #include<iostream> 2 #include<string> 3 #include<cstdlib> 4 #include<cstring> 5 #include<iomanip> 6 #include<stack> 7 using namespace std; 8 9 #define OK 0 10 #define ERROR -1 11 #define OVERFLOW -1 12 #define OPSETSI

Vs2013在Linux开发中的应用(26):表达式计算

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 当VS调试时将鼠标移到一个变量上面的时候,VS将显示这个变量的值,实际上这个时候VS进行了表达式的计算,我们所需要做的,就是把这个过程转换为gdb的命令: Operation Description -enable-pretty-printing enable Python-based pretty-printing -var-create create a variable object -v

HDU 2424-Gary&#39;s Calculator(表达式计算+大数)

Gary's Calculator Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 950    Accepted Submission(s): 209 Problem Description Gary has finally decided to find a calculator to avoid making simple cal

C++实现 逆波兰表达式计算问题

C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack { private: int size; int top; float *listArray; public: Stack(int sz=20); ~Stack(); bool push(float it);//入栈 bool pop(float& it);//出栈 bool isEmpty();//

爪哇国新游记之二十二----算术表达式计算求值

代码: import java.util.ArrayList; import java.util.List; // 辅助类 class Item{ String value; boolean isNumber; public Item(String value,boolean isNumber){ this.value=value; this.isNumber=isNumber; } public Item(char c,boolean isNumber){ this.value=String.

C#动态表达式计算

应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行某些条件的配置以及某些算法的配置并自动生成表达式或者生成数学模型: 程序中需要通过生成的表达式以及动态从数据库中获取的数据进行算法映射以及自动计算出结果. 该需求这边可以举出几个应用场景: 1.报表设计器 我们可以通过报表设计器设计数据库的映射关系并配置数据之间的算法关系,然后动态生成报表: 2.某些采集工具 定向采集

蓝桥杯 算法训练 ALGO-156 表达式计算

算法训练 表达式计算 时间限制:1.0s   内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. 题目解析: 运算优先级: 括号 → 乘除 → 加减 例如 1-2+3*(4-5) (1)计算(4-5),表达式变为  1-2+3*-1 (2

表达式计算系列【未完】

P1040 表达式计算 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一个表达式,其中运算符仅包含+,要求求出表达式的最终值 输入格式 仅一行,即为表达式 输出格式 仅一行,既为表达式算出的结果 测试样例1 输入 1+1 输出 2 备注 表达式总长度<=1500 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 string ans(1501