BUAA计算器(表达式计算-表达式树实现)

本文介绍了如何使用C语言和表达式树来处理整数算术运算表达式,包括括号嵌套和整数除法。通过后缀表达式生成表达式树,对给定的示例表达式进行计算,最终输出计算结果18。这个过程涉及到运算符优先级和中缀表达式到后缀表达式的转换。
摘要由CSDN通过智能技术生成

【问题描述】

从标准输入中读入一个整数算术运算表达式,如24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 )= ,计算表达式结果,并输出。

要求:
1、表达式运算符只有+、-、*、/,表达式末尾的=字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中会出现圆括号,括号可能嵌套,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。

4、要求采用表达式树来实现表达式计算。

表达式树(expression tree):

我们已经知道了在计算机中用后缀表达式和栈来计算中缀表达式的值。在计算机中还有一种方式是利用表达式树来计算表达式的值。表达式树是这样一种树,其根节点为操作符,非根节点为操作数,对其进行后序遍历将计算表达式的值。由后缀表达式生成表达式树的方法如下:

l 读入一个符号:

l 如果是操作数,则建立一个单节点树并将指向他的指针推入栈中;

l 如果是运算符,就从栈中弹出指向两棵树T1和T2的指针(T1先弹出)并形成一棵新树,树根为该运算符,它的左、右子树分别指向T2和T1,然后将新树的指针压入栈中。

例如输入的后缀表达为:

ab+cde+**

则生成的表达式树为:
在这里插入图片描述

【输入形式】

从键盘输入一个以=结尾的整数算术运算表达式。操作符和操作数之间可以有空格分隔。

【输出形式】

首先在屏幕上输出表达式树根、左子节点及右子节点上的运算符或操作数,中间由一个空格分隔,最后有一个回车(如果无某节点,则该项不输出)。然后输出表达式计算结果。
【样例输入】

24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 ) =

【样例输出】

*/ /

18

【样例说明】

按照运算符及括号优先级依次计算表达式的值。在生成的表达树中,*是根节点的运算符,/ 是根节点的左子节点上运算符,/是根节点的右子节点上运算符,按题目要求要输出。

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct numop
{
    // define elemnet
    int num;
    char op;
} sto[501];

struct opstack
{
    // define stack
    int top;
    struct numop sto[500];
};

struct Tree
{
    // define Tree
    int n;
    char o;
    struct Tree *l;
    struct Tree *r;
};

struct tree_pro
{
    // tree stack
    struct Tree tree[502];
    int top;
} t;

typedef struct opstack stack;
stack o;                // operation
struct Tree *u, *v, *w; // temporary struct
char c;
int i, j, k, n;

void initstack(stack *s)
{
    // init stack
    s->top = -1;
}

void push_tree(struct tree_pro *t, int m,
               char c)
{
    // stack in member and operation
    if (m != -1)
    {
   
        t->tree[++t->top].l = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值