C++ 中缀转后缀表达式并求值
//中缀转后缀
#include<iostream>
#include<stack>
using namespace std; int prio(char x){
if(x=='*'||x=='/') return ;
if(x=='+'||x=='-') return ;
if(x=='(') return ;
else return -; }
void in_to_post(char* inorder,char* &post){
stack<char>S;
int k=;
while(*inorder){
//数字
if(*inorder>=''&&*inorder<=''){
post[k++] = *inorder;
}
//操作符
else{
if(S.empty()) {
S.push(*inorder);
}
else if(*inorder=='('){
S.push(*inorder);
}
else if(*inorder==')'){
while(S.top()!='('){
post[k++]=S.top();
S.pop();
}
S.pop();
}
else{
while(prio(*inorder)<=prio(S.top())){
post[k++]=S.top();
S.pop();
if(S.empty()) break;
}
S.push(*inorder);
}
}
inorder++;
}
if(!S.empty()){
char c =S.top();
post[k++] = c;
S.pop();
}
}
//后缀表达式求值
int cal(int a,int b,char c){
if(c=='+') return a+b;
else if(c=='-') return a-b;
else if(c=='*') return a*b;
else if(c=='/') return a/b;
else return ;
} int postcal(char* post){
stack <int > s;
while(*post){
if(*post >=''&& *post<=''){
s.push(*post);
}
else{
int a = s.top()-;
s.pop();
int b = s.top()-;
s.pop();
int c = cal(b,a,*post);
s.push(c+);
}
post++;
}
return s.top()-;
} int main(){
cout<<"输入中缀表达式:"<<endl;
char* inorder =new char;
cin>>inorder;
char* post= new char;
cout<<"后缀表达式为:";
in_to_post(inorder,post);
cout<<post<<endl;
int res = postcal(post);
cout<<"后缀表达式计算结果:"<<res<<endl;
}
求解思想:
中缀转后缀表达式:
从左到右扫描输入的中缀表达式,若是数字,则直接输出到结果,若是运算符则判断:
1. ‘(’ :直接入栈;
2. ‘)’:依次把栈中的运算符输出到结果,知道出现‘(’,将左括号从栈中删除;
3. 若是其他运算符,判断当前运算符与栈顶元素的优先级(*/ 为2,+-为1,( 为0,其他为-1),若是当前运算符优先级较高,则直接入栈,否则,依次输入比当前运算符优先级高或相等的运算符,知道遇到不符合条件的元素或者遇到左括号为止,再将当前运算符入栈。
扫描结束后,将栈内存放的运算符依次输出到结果。
例如:3*5+((1+3)/2+1)
3 放入结果; 结果:3 栈内:
* 放入栈内; 结果:3 栈内:*
5 放入结果; 结果:35 栈内:*
+:将*输入,+放入栈内 结果:35* 栈内:+
( 放入栈内; 结果:35* 栈内:+(
( 放入栈内; 结果:35* 栈内:+((
1 放入结果; 结果:35*1 栈内:+((
+ 放入栈内; 结果:35*1 栈内:+((+
3 放入结果; 结果:35*13 栈内:+((+
):输出+,删除(; 结果:35*13+ 栈内:+(
/ 放入栈内; 结果:35*13+ 栈内:+(/
2 放入结果; 结果:35*13+2 栈内:+(/
+: 输出/,+放入栈内; 结果:35*13+2/ 栈内:+(+
1 放入结果; 结果:35*13+2/1 栈内:+(+
):输出+,删除(; 结果:35*13+2/1+ 栈内:+
把栈内剩余元素依次输出; 结果:35*13+2/1++ 栈内:
后缀表达式求值:
从左到右扫描输入的后缀表达式,若是数字则入栈;若是操作符,则从栈中取出两个数,进行相应计算后,将结果放回栈中,;扫描完后,栈顶剩余元素就是结果。
由于输入时并未区分数字和操作符,而是统一规定成了char 类型,所以要将每两个操作数计算的结果也要转换成ASCII码对应的字符类型,所以要进行+-48的操作。
也可以在一开始读取输入的时候就区分int类型和char类型,然后分开设栈。
C++ 中缀转后缀表达式并求值的更多相关文章
- 中缀表达式转逆波兰式(后缀表达式)求值 C++ Stack
给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'(' push else if 字符为 ')' 出栈运算符直到遇到‘(' else if ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- C++ 使用栈求解中缀、后缀表达式的值
1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Java数据结构和算法(六):前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- 栈的应用1——超级计算器(中缀与后缀表达式)C语言
这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...
- C语言对表达式的求值顺序不是明确规定的
讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ...
- 前缀、中缀、后缀表达式以及简单计算器的C++实现
前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式 ...
- java四则运算----前缀、中缀、后缀表达式
接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现 ...
随机推荐
- ECMAScript6 入门教程记录 变量的解构赋值
(1)变量的解构赋值 基本用法:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). let a = 1; let b = 2; let c = ...
- tcpdf中增加微软雅黑的正确方式
找了很多增加字体的方式,不过提供的命令行下增加字体的命令是错误的,下面这个命令是验证过可以用的,不管是win还是linux活着mac都可以. tcpdf对中文的支持就不太好, 当然也可以支持, 比如里 ...
- 使用jconsole监控JVM内存
首先声明:此篇博文分析的是JDK1.8. JVM内存区域总体分两类:heap区和非heap区.Jconsole中对内存划分为同样的结构,如下: heap区又分为: - Eden Space(伊甸园) ...
- Java-对象及变量的并发访问小结
1)多线程环境下,方法内的变量是线程安全的 2)多个线程同时处理一个实例,这个实例内的变量是不安全的 3)不同线程中注入同一个类的不同实例,实例中的变量是安全的 4)Synchronized获取到的锁 ...
- Genymotion-Android模拟器提示"Unable to connect to the Genymotion server. Please check your Internet connection."解决方法
昨天刚装的Genymotion,昨晚还用得好好的. 今晚开机,重新打开Genymotion,却提示:"Unable to connect to the Genymotion server. ...
- uploadify上传图片的使用
一:引用jquery.uploadify.js 二:代码 <body> <table> <tr> <td style="width: 15%; te ...
- Vue 旅游网首页开发2 - 首页编写
Vue 旅游网首页开发2 - 首页编写 项目结构 首页开发 效果图 项目开发组件化 将页面的各个部分划分成不同的组件,有助于项目的开发和维护. 项目代码初始化 项目结构修改 1.删除整个 compin ...
- MySQL表结构更新规范
以下以新增字段为例,修改.删除.新增表的操作类似: 步骤: 1.PDM(中文名称为产品数据管理(Product Data Management))增加字段,并注明新增字段的注释 2.数据库编写sql语 ...
- 问题:Linux报swap空间占用过高,但物理内存还有空余
报错 收到报警,swap空间占用过高,登录到系统查看内存使用详情,看到物理内存还有很多未使用 问题分析 Swap配置对性能的影响分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错 ...
- webmagic爬虫抓取工作室成员博客
一.导入依赖 <!--webmagic依赖--> <dependency> <groupId>us.codecraft</groupId> <ar ...