目录

中缀表达式求值

中缀表达式转化为二叉树


中缀表达式求值

算法思想:把数字和操作符分别放在栈中,遇到操作符时,与栈顶操作符的优先级比较,如果优先级比栈顶的低就进行运算。

#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

中缀表达式求值,中缀表达式转化为二叉树相关推荐

  1. nyoj 1272 表达式求值(中缀式转后缀式)

    表达式求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...

  2. c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!

    已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...

  3. c语言作业算术表达式求值,算术表达式求值演示(C语言版)

    //头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...

  4. 栈应用:中缀表达式求值

    后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单,不再复习了,下面着重记录中缀表达式求值 中缀表达式求值可以先将中缀转后缀,再用后缀计 ...

  5. 表达式求值(中缀转后缀及后缀表达式求值)

    .中缀表达式转后缀表达式: 中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素 ...

  6. 信息学奥赛一本通 1962:【13NOIP普及组】表达式求值 | 洛谷 P1981 [NOIP2013 普及组] 表达式求值

    [题目链接] ybt 1962:[13NOIP普及组]表达式求值 洛谷 P1981 [NOIP2013 普及组] 表达式求值 [题目考点] 栈 中缀表达式转后缀表达式,后缀表达式求值 中缀表达式求值 ...

  7. 栈的应用——表达式求值(双栈)

    1.表达式求值 中缀表达式是正常的表达式形式, 例如:4.99 * 1.06 + 5.99 + 6.99 * 1.06 后缀表达式是针对中缀表达式而言的,可以理解为:操作符在两个操作数之后. 例如:4 ...

  8. 【经典算法】-算术表达式求值

    算术表达式求值 中缀表达式 我们平时写的计算式的式子一般是这样子 格式:"操作数1 操作符 操作数2"12 * (3 + 4) - 6 + 8 / 2; // 中缀表达式 中缀表达 ...

  9. 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式

    文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...

  10. c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值

    一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...

最新文章

  1. 读取文件夹下所有的文件
  2. sqlserver 分页_四类数据库分页实现方案总结之PG分页实现
  3. leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
  4. nginx常用配置目录
  5. 网络连接异常、网站服务器失去响应_网站常见故障解决办法
  6. 面向对象:实例化的对象调用类方法 db.Column()
  7. SQL2012(32位)下载及安装(32位、64位都一样,不影响)
  8. drawRect方法在UIImageView的派生类中不被调用
  9. UNDO 表空间管理
  10. 计算机磁盘管理使用不,win10系统提示“操作无法完成,因为磁盘管理控制台不是最新状态”的处理方法...
  11. 项目经理案头手册学习系列【9、10】——资源强制进度计划、应用PERT编制进度计划...
  12. Mac下安装java运行环境
  13. ajax中返回sucess里使用this.$message()
  14. Win10中启动或关闭Windows功能中没有SNMP服务的解决办法
  15. 编程算法 - 大整数乘法
  16. 华为网络配置(IPSec)
  17. C#扩展(2):Random的扩展
  18. python pdf解密脚本(pikepdf模块)
  19. c语言输入三个商品的价格,若有一个大于100元或者总价大于200元,全部商品打9折,并完成付款和找零
  20. 从粗放到精细,能量采集技术如何赋能农业智慧升级?

热门文章

  1. poj 1159 (DP LCS)
  2. list 排序 java_java 怎么将List里面数据排序?
  3. python pip 删除所有包
  4. Ubuntu16.04 安装 VIM 代码自动补全插件 YCM
  5. Understanding The Linux Virtual Memory Manager
  6. windows DNS 服务器递归查询超时机制
  7. linux 注册并配置
  8. es 多索引联合查询_HBase二级索引设计思想
  9. 使用内存映射文件在进程间共享数据
  10. 基于javaweb的学生考勤管理系统(java+SSM+Poi导出+Easyui+JFreeChart+maven+mysql)