转换算术表达式

文章目录


构造二叉树表示的算术表达式:按先序次序输入二叉树中结点的值(操作数及运算符均以一位字符表示,注意转换),

'#'字符表示空树,如上图的算术表达式

输入+2##*3##4##

输入格式

第一行输入表示要计算的算术表达式的二叉树结点的先序遍历序列,空树用#表示

输出格式

第一行输出该算术表达式的值

输入样例

+2##*3##4##

输出样例

14

部分代码如下:

c 复制代码
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int  Status;

const int MAXN = 1000;
int lch[MAXN],rch[MAXN];
char op[MAXN];
char input[MAXN];
int nc=0;

typedef char  ElemType;
typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
ElemType Calculate(BiTree T){
    int value = 0;
	BiTNode *p = T;    //创建指针指向根结点
	ElemType val_l, val_r;
	if(T){
		val_l = Calculate(p->lchild);    //递归计算左、右子树
		val_r = Calculate(p->rchild);
		switch(p->optr){        //根据根节点的字符将左右子结果计算为当前这一层子树的结果
			case'+':
				value = val_l + val_r;
				break;
			case'-':
				value = val_l - val_r;
				break;
			case'*':
				value = val_l * val_r;
				break;
			case'/':
				value = val_l / val_r;
				break;
			default:
				break;
		}
	}
	return value;
}

Status CreateBiTree(BiTree &T)    // 算法6.4
{
    // 按先序次序输入二叉树中结点的值(一个字符),'#'字符表示空树,
    // 构造二叉链表表示的二叉树T。
    char ch;
    scanf("%c",&ch);
    if (ch=='#') T = NULL;
    else
    {
        if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
        T->data = ch; // 生成根结点
        CreateBiTree(T->lchild);   // 构造左子树
        CreateBiTree(T->rchild);  // 构造右子树
    }
    return OK;
}

int main()   //主函数
{
    BiTree T;
    CreateBiTree(T);
    printf("%d\n",Calculate(T));
    return 0;
}//main

代码如下:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
struct TreeNode
{
    char value;
    struct TreeNode* left;
    struct TreeNode* right;
};

int calculate(struct TreeNode* root)
{
    if (root == NULL)
    {
        return 0;
    }
    if (root->left == NULL && root->right == NULL)
    {
        return root->value - '0';
    }
    int left = calculate(root->left);
    int right = calculate(root->right);
    switch (root->value)
    {
    case '+':
        return left + right;
    case '-':
        return left - right;
    case '*':
        return left * right;
    case '/':
        return left / right;
    default:
        return 0;
    }
}

struct TreeNode* createNode(char value)
{
    struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    node->value = value;
    node->left = NULL;
    node->right = NULL;
    return node;
}

struct TreeNode* buildTree()
{
    char value = getchar();
    if (value == '#')
    {
        return NULL;
    }
    struct TreeNode* node = createNode(value);
    node->left = buildTree();
    node->right = buildTree();
    return node;
}

int main()
{
    struct TreeNode* root = buildTree();
    printf("%d\n", calculate(root));
    return 0;
}

相关推荐
yueyuexiaokeai114 分钟前
linux kernel常用函数整理
linux·c语言
John_ToDebug1 小时前
浏览器内核崩溃深度分析:从 MiniDump 堆栈到 BindOnce UAF 机制(未完待续...)
c++·chrome·windows
你撅嘴真丑1 小时前
字符环 与 变换的矩阵
算法
想放学的刺客1 小时前
单片机嵌入式试题(第29期)嵌入式系统的电源完整性设计与去耦电容选型。抗干扰设计与EMC合规性
c语言·stm32·嵌入式硬件·物联网·51单片机
早点睡觉好了1 小时前
重排序 (Re-ranking) 算法详解
算法·ai·rag
gihigo19981 小时前
基于全局自适应动态规划(GADP)的MATLAB实现方案
算法
念越2 小时前
数据结构:栈堆
java·开发语言·数据结构
txinyu的博客2 小时前
解析muduo源码之 SocketsOps.h & SocketsOps.cc
c++
dear_bi_MyOnly2 小时前
【多线程——线程状态与安全】
java·开发语言·数据结构·后端·中间件·java-ee·intellij-idea
ctyshr2 小时前
C++编译期数学计算
开发语言·c++·算法