文章目录

  • 题目描述
  • 黑框运行的代码
  • 黑框代码下载链接
  • QT完成页面的代码下载链接

题目描述

一个表达式和一棵二叉树之间,存在着自然的对应关系。写一个程序,实现
基于二叉树表示的算术表达式Expression的操作。
假设算术表达式Expression内可以含有变量(a-z),常量(0-9)和二元运算符(+,-,,/,^(乘幂))。实现以下操作:
(1)ReadExpr(E)――以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
(2)WriteExpr(E)――用带括号的中缀表达式输出表达式E。
(3)Assign(V,c)――实现对变量V的赋值(V=c),变量的初值为0。
(4)Value(E)――对算术表达式E求值。
(5)CompoundExpr(p,E1,E2)――构造一个新的复合表达式(E1)p(E2)。
(6)以表达式的原书写形式输入,支持大于0的正整数常量;
(7)增加常数合并操作MergeConst(E)——合并表达式E中所有常数运算。例如,对表达式E=(2+3-a)
(b+34)进行合并常数的操作后,求得E=(5-a)(b+12)

黑框运行的代码

表达式类型主体代码:

#pragma once#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<algorithm>
#include<map>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#include<strstream>
#include<fstream>
const int N = 9999999;
using namespace std;
//bool assign_flag = 1;
enum Data_type { INT, CHAR };
struct Data
{Data_type datatag;union{int num;char c;};
};
struct binarynode
{Data element;binarynode* lchild, * rchild;binarynode(){lchild = rchild = nullptr;}binarynode(const Data& e){element = e;lchild = rchild = nullptr;}binarynode(const Data& e, binarynode* l, binarynode* r){element = e;lchild = l;rchild = r;}
};
class binarytree//为了递归调用is_all_assigned,inborder,preorder都需要传入参数
{private:bool assign_flag = 1;binarynode* root;int size;bool isoperator(char op){if (op == '+' || op == '-' || op == '*' || op == '/' || op == '^')return true;elsereturn false;}bool pricmp(char a, char b)//true:a>b  false:b>a{if (isoperator(a) && isoperator(b)){if (a == '^'){if (b == '^') return true;else return false;}else if (a == '*' || a == '/'){if (b == '*' || b == '/' || b == '^')return false;else return true;}elsereturn false;}elsereturn false;}void maketree(const Data& e, binarytree& l, binarytree& r){root = new binarynode(e, l.root, r.root);size = l.size + r.size;l.root = r.root = nullptr;l.size = r.size = 0;}bool judge_type(/*binarynode p,*/char c)//数字返回1,字母返回0{if (isdigit(c)){root->element.datatag = INT;root->element.num = c - '0';return 1;}else{root->element.datatag = CHAR;root->element.c = c;return 0;}}void is_all_assigned(binarynode* r)//检查表达式中的变量是否全部赋值{if (r != nullptr && r->element.datatag == CHAR){//cout << r->element.c << " ";//isalpha(r->element.c)if (r->element.c!='+'&& r->element.c != '-'&&r->element.c != '*'&& r->element.c != '/'&& r->element.c != '^'){cout << "变量" << r->element.c << "未赋值" << endl;assign_flag = 0;return;}is_all_assigned(r->lchild);is_all_assigned(r->rchild);}}int calculate(int a, char op, int b){if (op == '+')return a + b;else if (op == '-')return a - b;else if (op == '*')return a * b;else if (op == '/'){if (b == 0){cout << "除数不能为0!" << endl;return N;}elsereturn a / b;}else if (op == '^')return pow(a, b);}
public:void preorder_output(){//cout << "前缀表达式:" << endl;preorder(root);cout << endl;}void preorder(binarynode* r){ofstream out("preorder.txt");if (r != nullptr){if (r->element.datatag == INT)out << r->element.num;elseout << r->element.c;preorder(r->lchild);preorder(r->rchild);}}void inorderbacket_output(){cout << "完全括号化的中缀表达式:";inorder_allbacket(root);cout << endl;}void inorder_allbacket(binarynode* r){if (r != nullptr){cout << "(";inorder_allbacket(r->lchild);if (r->element.datatag == INT)cout << r->element.num;elsecout << r->element.c;inorder_allbacket(r->rchild);cout << ")";}}void WriteExpr(){//        cout << "带括号的中缀表达式:";writeexpr(root);
//        cout << endl;}void writeexpr(binarynode* r){ofstream out("inorder.txt");if (r != nullptr){if (r->lchild && r->lchild->element.datatag == CHAR){if (pricmp(r->element.c, r->lchild->element.c))//当前节点优先级高于左孩子{out << "(";writeexpr(r->lchild);out << ")";}elsewriteexpr(r->lchild);}elsewriteexpr(r->lchild);if (r->element.datatag == INT)out << r->element.num;elseout << r->element.c;if (r->rchild && r->rchild->element.datatag == CHAR){if (pricmp(r->element.c, r->rchild->element.c)){out << "(";writeexpr(r->rchild);out << ")";}elsewriteexpr(r->rchild);}elsewriteexpr(r->rchild);}}bool ReadExptr(string str){stack<binarynode*> s;//stack<int> nums;binarynode p, q;int len = str.length();root = new binarynode;//****************root->lchild = root->rchild = nullptr;if (len == 1){if (isdigit(str[0])){root->element.datatag = INT;root->element.num = str[0] - '0';return true;}else if (isalpha(str[0])){root->element.datatag = CHAR;root->element.c = str[0];return true;}else{cout << "非法输入!" << endl;return false;}}else{for (int i = len - 1; i >= 0; i--){binarynode* pnode = new binarynode;if (isdigit(str[i])){pnode->element.datatag = INT;pnode->element.num = str[i] - '0';}else{//cout << str[i] << " ";pnode->element.datatag = CHAR;pnode->element.c = str[i];}pnode->lchild = nullptr; pnode->rchild = nullptr;/*if (isdigit(str[i]))nums.push(str[i] - '0');*/if (isoperator(str[i])){pnode->lchild = s.top(); s.pop();pnode->rchild = s.top(); s.pop();}s.push(pnode);}root = s.top();s.pop();//弹出最终的结果表达式if (s.empty())//若s中为空,则构造成功return true;else//若s中还有东西,则构造失败{cout << "ERROR!!!" << endl;return false;}}}void assign(binarynode* r, char v, int& num){if (r != nullptr){if (r->element.datatag == CHAR && r->element.c == v){//cout << r->element.c << "=" << v << "=" << num;r->element.datatag = INT;r->element.num = num;//错误输入处理:修改num值为N,之后用来 判断是否成功赋值。num = N;}assign(r->lchild, v, num);assign(r->rchild, v, num);}}void Assign(char v, int num){assign(root, v, num);if (num != N)cout << "本次未成功赋值,请勿输入表达式中不存在的变量。" << endl;}int Value(binarynode* r){if (r != nullptr){if (r->lchild == nullptr && r->rchild == nullptr && r->element.datatag == INT)//到达底层return r->element.num;return calculate(Value(r->lchild), r->element.c, Value(r->rchild));}}void Value_output(){//cout <<"assign="<< assign_flag << endl;is_all_assigned(root);//cout<<"assign=" << assign_flag << endl;if (assign_flag)//全赋值{writeexpr(root); cout << "=";cout << Value(root) << endl;}else{cout << "含有未赋值的变量,无法计算表达式的值!" << endl;assign_flag = 1;}}void CompoundExpr(char p, binarytree a, binarytree b){root = new binarynode;root->element.datatag = CHAR;root->element.c = p;root->lchild = a.root;root->rchild = b.root;cout << "复合表达式:";writeexpr(root);cout << endl;}void mergeconst(binarynode* r){if (r->lchild != nullptr && r->rchild != nullptr){if (r->lchild->element.datatag == INT && r->rchild->element.datatag == INT){int ans = calculate(r->lchild->element.num, r->element.c, r->rchild->element.num);r->element.datatag = INT;r->element.num = ans;delete r->lchild;delete r->rchild;r->lchild = r->rchild = nullptr;}else{mergeconst(r->lchild);mergeconst(r->rchild);}}}void MergeConst(){mergeconst(root);writeexpr(root);cout << endl;}
};

黑框代码下载链接

https://download.csdn.net/download/weixin_41894030/11290832

QT完成页面的代码下载链接

https://download.csdn.net/download/weixin_41894030/12675352

表达式类型( 一个表达式和一棵二叉树之间,存在着自然的对应关系。写一个程序,实现 基于二叉树表示的算术表达式Expression的操作)相关推荐

  1. 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数

    给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数 文章目录 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数 一.问题 二.分析 三.错解 四.正解一 五.正解二 ...

  2. java runnable main_Java 线程类问题写一个线程类MyThread,该线程实现了Runnable接口,写一个main方法, * 用for循...

    共回答了24个问题采纳率:91.7% interrupt(), stop(), suspend() 都不推荐再用,而是应该让 run 方法正常地退出,如果你打算让它循环,就在 run() 方法内用一个 ...

  3. c语言算术运算的作用,C语言算术运算符和算术表达式

    C语言算术运算符和算术表达式 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.下面和大家分享一些C语言算术运算符和算术表达式,一起来看看吧! 一. 基本的算术运算符 (1)+(加法运算 ...

  4. 编程题实训-实验2-基于栈的算术表达式求值算法(北京林业大学)

    第1关:基于栈的中缀算术表达式求值 任务描述 本关任务:输入一个中缀算术表达式,求解表达式的值.运算符包括+.-.*./.(.).=,参加运算的数为double类型且为正数.(要求:直接针对中缀算术表 ...

  5. 算术表达式求值的程序设计与实现_数据结构课程设计

    以下内容可且仅可供参考,如有错误欢迎指正. 部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉 <算术表达式求值的程序设计与实现>题目要 ...

  6. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  7. 数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出该表达式转换所得到的后缀式. ...

  8. 数据结构实验之栈二:一般算术表达式转换成后缀式

    题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/ ...

  9. 1.3编程基础之算术表达式与顺序执行(20题)-2022.02.26

    1.3编程基础之算术表达式与顺序执行 01 A+B问题 (Python3实现) 1.3编程基础之算术表达式与顺序执行 01 A+B问题 (Python3实现)_青少年趣味编程-CSDN博客 P1001 ...

  10. 1.3 编程基础之算术表达式与顺序执行(20题)

    1.3编程基础之算术表达式与顺序执行 01 A+B问题 (Python3实现) https://blog.csdn.net/dllglvzhenfeng/article/details/1226799 ...

最新文章

  1. linux设备模型bus,device,driver,(kobject、ktype、kset,bus_type、device、device_driver)
  2. Caffeine Cache~高性能 Java 本地缓存之王
  3. Spring boot请求拦截
  4. python默认字体大小_python – 如何设置PIL加载的默认字体的大小,使其适合我的8×8矩阵?...
  5. mysql skip_counter_mysql的三个故障解决小结
  6. abap oo 语法
  7. ERP会给企业带来什么好处?
  8. cart算法_ID3、C4.5、CART决策树算法
  9. C++中new和delete来创建和释放动态数组
  10. MyBatis基础入门《十七》动态SQL
  11. 数学教师计算机能力提升,为未来“计算”,做一名新时代的数学教师
  12. ES6新特性:Javascript中Generator(生成器)
  13. Ajax学习笔记(1)
  14. 数据分析挖掘全套课程视频spss/sas/R/excel/案例实战体系教学
  15. PHP生成二维码方法
  16. ResNet网络结构详解(Tensorflow2.6.0实现网络结构)
  17. 为什么canvas画的是正方形是长方形
  18. 【洛谷P3987】我永远喜欢珂朵莉~【卡常】
  19. 学生每日计划表_初三学生逆袭每日计划表
  20. bzoj 2109: [Noi2010]Plane 航空管制 贪心+拓扑排序

热门文章

  1. (1)DBA查询:数据库
  2. 微信小程序 - 为何setData到页面上有的加分号
  3. 2016012072+张济吨+散列函数的应用及其安全性
  4. python 用pip安装python库下载超时的解决办法
  5. php include 和require的区别与转码
  6. cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动
  7. 原反补移码的概念应用以及异或的作用
  8. SQL必知必会-数据库基础
  9. dreawever与php做网页,教程方法;Drea、mweaver CS5更改代码颜色方法电脑技巧-琪琪词资源网...
  10. hive hql文档_Hive存储过程HQL/SQL(一)–hplsql命令行