中缀表达式求值,中缀表达式转化为二叉树
目录
中缀表达式求值
中缀表达式转化为二叉树
中缀表达式求值
算法思想:把数字和操作符分别放在栈中,遇到操作符时,与栈顶操作符的优先级比较,如果优先级比栈顶的低就进行运算。
#include<stack>
#include<stdlib.h>
#include<iostream>
#include<ctype.h>
#include<string.h>
using namespace std;
int pre(char c)//优先级判断
{if(c=='=') return 0;else if(c=='+'||c=='-')return 1;else if(c=='*'||c=='/')return 2;else return 0;
}
void calculate(stack<double> &num,stack<char> &op)//运算
{double b=num.top();num.pop();double a=num.top();num.pop();switch(op.top()){case '+':num.push(a+b);break;case '-':num.push(a-b);break;case '*':num.push(a*b);break;case '/':if(b==0)throw"错误:除数为0";else{num.push(a/b);break;}}op.pop();
}
int main()
{try{stack<double> num;//存储数字stack<char> op;//存储操作符string s;cin>>s;//读取整个字符串for(int i=0; s[i]!='\0'; i++){if(isdigit(s[i]))//判断是否为数字{double temp=atof(&s[i]);//转化为浮点数num.push(temp);//入栈while(isdigit(s[i])||s[i]=='.')//寻找下一个操作符 i++;i--;//由于有外层循环,往前挪一位}else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='('||s[i]==')'||s[i]=='=')//字符是操作符{if(s[i]=='(')op.push(s[i]);else if(s[i]==')'){while(op.top()!='(')//计算括号内的式子calculate(num,op);op.pop();//左括号出栈}else if(op.empty()||pre(s[i])>pre(op.top()))//优先级大于栈顶,或栈为空时,直接进栈op.push(s[i]);else if(!op.empty()&&pre(s[i])<=pre(op.top()))//是优先级不大于栈顶的操作符,且栈不空,先进行运算操作{while(!op.empty()&&pre(s[i])<=pre(op.top()))calculate(num,op);op.push(s[i]);//将优先级大于它的操作做完再让它进栈}}else throw"错误:输入不符合规范";}printf("%.2lf\n",num.top());//输出结果num.pop();op.pop();//清空栈}catch(const char *mess){cout<<mess<<endl ;}return 0;
}
输入: 0.6*(10.6-1.9/2)+5.6=
输出:11.39
中缀表达式转化为二叉树
采用中缀表达式求值的算法思想,只是操作数栈中用存储指向结点的指针来代替存储操作数。采用中缀表达式求值的算法思想,只是操作数栈中用存储指向结点的指针来代替存储操作数。
此处为了方便操作,用字母代替数字,并默认表达式无错误
#include<stack>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
class treenode
{public:treenode *left;treenode *right;string data;
};
class tree
{public:treenode *root; //根节点 tree(treenode *x); //以一个节点为根节点构造书 ~tree() {}; //析构函数void print(); //输出树void preorder(const treenode *treeroot); //先序遍历void inorder(const treenode *treeroot); //中序遍历};
tree::tree(treenode *x)
{root=x;
}
void tree::preorder(const treenode *treeroot) //先序遍历
{if(treeroot!=NULL&&!treeroot->data.empty()){cout<<treeroot->data<<' ';preorder(treeroot->left);preorder(treeroot->right);}
}
void tree::inorder(const treenode *treeroot) //中序遍历
{if(treeroot!=NULL){inorder(treeroot->left);cout<<treeroot->data<<' ';inorder(treeroot->right);}
}
void tree::print() //输出树
{cout<<"先序:";preorder(root);cout<<endl<<"中序:";inorder(root);
}
int pre(char c)//优先级判断
{if(c=='=') return 0;else if(c=='+'||c=='-')return 1;else if(c=='*'||c=='/')return 2;else return 0;
}
void calculate(stack<treenode*> &num,stack<char> &op)//运算
{treenode * b=new treenode; //创建新节点,且储存字母1 b = num.top();num.pop();treenode * a=new treenode; //创建新节点,且储存字母2 a=num.top();num.pop();treenode *cur=new treenode; //创建新节点,且储存操作符 cur->left=a;cur->right=b;cur->data=op.top();num.push(cur); //新的子树压入栈中 op.pop();
}
int main()
{stack<treenode*> num;//存储节点 stack<char> op;//存储操作符char s;while((s=getchar())!='\n'){if(s>='a'&&s<='z')//判断是否为字母{treenode *p=new treenode;p->data=s;p->left=NULL;p->right=NULL;num.push(p);//入栈}else if(s=='+'||s=='-'||s=='*'||s=='/'||s=='('||s==')'||s=='=')//字符是操作符{if(s=='(')op.push(s);else if(s==')'){while(op.top()!='(')//计算括号内的式子,生成新的子树 calculate(num,op);op.pop();//左括号出栈}else if(op.empty()||pre(s)>pre(op.top()))//优先级大于栈顶,或栈为空时,直接进栈op.push(s);else if(!op.empty()&&pre(s)<=pre(op.top()))//是优先级不大于栈顶的操作符,且栈不空,先进行运算操作,生成新的子树 {while(!op.empty()&&pre(s)<=pre(op.top()))calculate(num,op);op.push(s);//将优先级大于它的操作做完再让它进栈}}}tree x(num.top()); //以当前节点为根节点产生二叉树 x.print(); //显示二叉树 op.pop();//清空栈return 0;
}
输入:a*(b+c)-d/e=
输出:先序:- * a + b c / d e
中序:a * b + c - d / e
中缀表达式求值,中缀表达式转化为二叉树相关推荐
- nyoj 1272 表达式求值(中缀式转后缀式)
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...
- c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!
已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...
- c语言作业算术表达式求值,算术表达式求值演示(C语言版)
//头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...
- 栈应用:中缀表达式求值
后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单,不再复习了,下面着重记录中缀表达式求值 中缀表达式求值可以先将中缀转后缀,再用后缀计 ...
- 表达式求值(中缀转后缀及后缀表达式求值)
.中缀表达式转后缀表达式: 中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素 ...
- 信息学奥赛一本通 1962:【13NOIP普及组】表达式求值 | 洛谷 P1981 [NOIP2013 普及组] 表达式求值
[题目链接] ybt 1962:[13NOIP普及组]表达式求值 洛谷 P1981 [NOIP2013 普及组] 表达式求值 [题目考点] 栈 中缀表达式转后缀表达式,后缀表达式求值 中缀表达式求值 ...
- 栈的应用——表达式求值(双栈)
1.表达式求值 中缀表达式是正常的表达式形式, 例如:4.99 * 1.06 + 5.99 + 6.99 * 1.06 后缀表达式是针对中缀表达式而言的,可以理解为:操作符在两个操作数之后. 例如:4 ...
- 【经典算法】-算术表达式求值
算术表达式求值 中缀表达式 我们平时写的计算式的式子一般是这样子 格式:"操作数1 操作符 操作数2"12 * (3 + 4) - 6 + 8 / 2; // 中缀表达式 中缀表达 ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值
一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...
最新文章
- 读取文件夹下所有的文件
- sqlserver 分页_四类数据库分页实现方案总结之PG分页实现
- leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
- nginx常用配置目录
- 网络连接异常、网站服务器失去响应_网站常见故障解决办法
- 面向对象:实例化的对象调用类方法 db.Column()
- SQL2012(32位)下载及安装(32位、64位都一样,不影响)
- drawRect方法在UIImageView的派生类中不被调用
- UNDO 表空间管理
- 计算机磁盘管理使用不,win10系统提示“操作无法完成,因为磁盘管理控制台不是最新状态”的处理方法...
- 项目经理案头手册学习系列【9、10】——资源强制进度计划、应用PERT编制进度计划...
- Mac下安装java运行环境
- ajax中返回sucess里使用this.$message()
- Win10中启动或关闭Windows功能中没有SNMP服务的解决办法
- 编程算法 - 大整数乘法
- 华为网络配置(IPSec)
- C#扩展(2):Random的扩展
- python pdf解密脚本(pikepdf模块)
- c语言输入三个商品的价格,若有一个大于100元或者总价大于200元,全部商品打9折,并完成付款和找零
- 从粗放到精细,能量采集技术如何赋能农业智慧升级?
热门文章
- poj 1159 (DP LCS)
- list 排序 java_java 怎么将List里面数据排序?
- python pip 删除所有包
- Ubuntu16.04 安装 VIM 代码自动补全插件 YCM
- Understanding The Linux Virtual Memory Manager
- windows DNS 服务器递归查询超时机制
- linux 注册并配置
- es 多索引联合查询_HBase二级索引设计思想
- 使用内存映射文件在进程间共享数据
- 基于javaweb的学生考勤管理系统(java+SSM+Poi导出+Easyui+JFreeChart+maven+mysql)