逆波兰式的产生与计算
生成逆波兰式流程图:
逆波兰式的计算流程图:
要求:
可以区分小数点、乘方、正负号
代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cctype>
#include<cstring>
using namespace std;char str[50]; //用于存放原来的表达式
int top; //栈顶指针
char stack[50]; //定义栈,用于计算逆波兰式
char ex[50]; //存放后缀表达式
double _stack[50]; //定义栈,用于计算逆波兰式子
int flag[50]; //用于区分+、-号的含义,0表示运算符,1表示正负号//生成逆波兰式
void NiBolan()
{memset(flag,0,sizeof(flag)); //flag初始值设为0char ch=str[0];int i=1,t=0;top=0;while(ch!='#'){switch(ch){case '(':top++;stack[top]=ch;break;case ')':while(stack[top]!='('){ex[t]=stack[top];top--;t++;}top--;break;case '^':while(stack[top]=='^') //设置^运算符优先级为最高{ex[t]=stack[top];top--;t++;}top++;stack[top]=ch;break;case '+':case '-'://当ch为+、-号是,若前面相邻字符不是')'或数字且后面相邻字符是数字时表示正负号if(isdigit(str[i]) && !isdigit(str[i-2]) && str[i-2]!=')'){flag[t]=1; //标记符号为正负号ex[t++]=ch;ch=str[i++];while((ch>='0'&&ch<='9')||ch=='.') //判别小数点{ex[t]=ch;t++;ch=str[i];i++;}i--;ex[t]='&';t++;}else{while(top!=0&&stack[top]!='('){ex[t]=stack[top];top--;t++;}top++;stack[top]=ch;}break;case '*':case '/':while(stack[top]=='*'||stack[top]=='/'||stack[top]=='^') //运算符^优先级高于*和/{ex[t]=stack[top];top--;t++;}top++;stack[top]=ch;break;case ' ':break;default:while((ch>='0'&&ch<='9')||ch=='.') //判别小数点{ex[t]=ch;t++;ch=str[i];i++;}i--;ex[t]='&';t++;}ch=str[i];i++;}while(top!=0)if(stack[top]!='('){ex[t]=stack[top];t++;top--;}else{printf("error");top--;exit(0);}ex[t]='#';ex[t+1]='\0';printf("后缀表达式:%s\n",ex);}//计算逆波兰式
void Calculate()
{char ch=ex[0];int t=0;top=-1;while(ch!='#'){if(ch=='&'){ch=ex[++t];continue;}switch(ch){case '+':if(flag[t]) //'+'表示正号{ch=ex[++t];double d=0;while(ch>='0'&&ch<='9'){d=10.0*d+double(ch-'0');ch=ex[++t];}if(ch=='.') //判断是否为小数{ch=ex[++t];double k=1.0;while(ch>='0'&&ch<='9'){d=d+double(ch-'0')/(10.0*k);k=k+1.0;ch=ex[++t];}}top++;_stack[top]=d;}else{_stack[top-1]=_stack[top-1]+_stack[top];top--;t++;}break;case '-':if(flag[t]) //'-'表示负号{ch=ex[++t];double d=0;while(ch>='0'&&ch<='9'){d=10.0*d+double(ch-'0');ch=ex[++t];}if(ch=='.'){ch=ex[++t];double k=1.0;while(ch>='0'&&ch<='9'){d=d+double(ch-'0')/(10.0*k);k=k+1.0;ch=ex[++t];}}top++;_stack[top]=-d;}else{_stack[top-1]=_stack[top-1]-_stack[top];top--;t++;}break;case '^': //运算符为'^'if(_stack[top]==0){_stack[top-1]=1;}else{int temp;temp=_stack[top-1];while(--_stack[top]){_stack[top-1]*=temp;}}top--;t++;break;case '*':_stack[top-1]=_stack[top-1]*_stack[top];top--;t++;break;case '/':if(_stack[top]!=0)_stack[top-1]=_stack[top-1]/_stack[top];else{printf("\n\tchu0error!\n");exit(0);}top--;t++;break;default:double d=0;while(ch>='0'&&ch<='9'){d=10.0*d+double(ch-'0');ch=ex[++t];}if(ch=='.') //判断是否为小数{ch=ex[++t];double k=1.0;while(ch>='0'&&ch<='9'){d=d+double(ch-'0')/(10.0*k);k=k+1.0;ch=ex[++t];}}top++;_stack[top]=d;}ch=ex[t];}cout<<"计算结果:"<<_stack[top]<<endl;//printf("计算结果:%lf\n",_stack[top]);
}int main()
{printf("请输入中缀表达式:");scanf("%s",&str); //输入原表达式printf("原来表达式:%s\n",str);NiBolan(); //生成逆波兰式Calculate(); //计算逆波兰式return 0;
}// 测试样例 结果
// 21+((42-2)*15+6)-18# 609
// 1+(-5)+-3*-1# -1
// 1+2^3*2# 17
// 1+-2^3*2# -15
// 1+(1-3)^3# -7
// 1*2^0# 1
运行结果:
逆波兰式的产生与计算相关推荐
- 逆波兰式的产生及计算(C++/Java)---编译原理
逆波兰式的产生及计算(C++版及Java版本)-编译原理,数据结构 在现实生活中大家对于计算使用都是中缀表达式(nifix expression),如但是在计算机中表达式常常是以后缀表达式(postf ...
- 逆波兰式的转换与计算(简单)
我们平常书写的表达式:--如2+3*4+4 又称为中缀表达式,我们可以将它转换为后缀表达式 213*+4+ 输入有两行,第一行为逆波兰式的结果,第二行为输入表达式的正确计算结果.逆波兰式中相邻的数字或 ...
- 编译原理逆波兰式实验java_逆波兰式算法的编译原理实验过程.doc
逆波兰式算法的编译原理实验过程 实验目的 深入理解算符优先分析法 掌握FirstVt和LastVt集合的求法有算符优先关系表的求法 掌握利用算符优先分析法完成中缀表达式到逆波兰式的转化 实验内容及要求 ...
- 对逆波兰式的简单理解
前言: 人是比较喜欢中缀式的,因为它符合人们的运算习惯:但是机器是不喜欢中缀式,它更喜欢后缀式,也就是逆波兰式. 逆波兰式的理解: 1.逆波兰式: ab35c-*+= 2.计算机计算过程: 策略:计算 ...
- php逆波兰表达式,PHP根据数字的字符表达式计算出结果(转换成逆波兰式再求解)[转]...
这个简单的计算器采用的是逆波兰式来做的,仅支持加减乘除四种运算,纯粹个人练习记录一下,还望多多支持. 用法 require 'Calc.php'; $calc = new Calc('(1+9)/2' ...
- 逆波兰式 java_逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)【java实现】...
一.逆波兰式(后缀表达式)计算 思路: * 1.遍历逆波兰式的集合 * 2.当遍历的元素为数字时,入栈 stack * 3.当遍历的元素为运算符时,stack栈弹出两个数,num2 num1,并用该运 ...
- 逆波兰式 java_Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析...
Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...
- php逆波兰表达式,PHP实现逆波兰式 - 计算工资时用
近期一个小项目需要用到公式运算, 所以就进行一些了解,以下内容均属于个人经验. 在PHP中实现公式表达式四则运算大概有两种方法: 1)使用系统函数eval 2)将表达式转换成逆波兰表达式进行计算. / ...
- 编译原理——逆波兰式分析计算
一.实验目的 将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值. 二.实验说明 1.逆波兰式定义 将运算对象写在前面,而把运算符号写在后面.用这 ...
最新文章
- mybatis plus 日志打印_mybatis升级为mybatis-plus踩到的坑
- 使用netty搭建一个简单的聊天室
- 当我们在谈论multidex65535时,我们在谈论什么
- Ubuntu win8 小设备版本
- Ajax基本案例详解之$.ajax的实现
- java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...
- e-mobile帐号状态存在异常_一文掌握异常检测的实用方法 | 技术实践
- 零基础、非计算机相关专业的如何转型程序员
- linux 复制指定类型,用Linux命令行实现删除和复制指定类型的文件
- php 解析字符串编码方式 GB2312 UTF8
- php编译后漏掉一些参数怎么办
- 计算机游戏蜘蛛纸牌如何还原,经典PC纸牌游戏空当接龙、蜘蛛纸牌等登陆iOS/Android...
- 趋势顶底(QSDD)----无未来函数
- Mysql监控工具小集合
- eNSP配置VLAN间路由
- 计算机应用研究中的文章见刊后,什么时候能在知网中查询到,论文网络首发后会被收录吗...
- SQL巩固以及数据库、表结构优化
- 3D变电站vr建模三维展示可视化管理系统
- scrapy的spider中为什么使用yield
- PTA:动物爱吃什么(c++,继承)
热门文章
- 8 位阿里大佬合著“Dubbo 微服务进阶笔记”
- 武士数独求解思路+代码实现(部分)
- 自己用C语言写NXP S32K116 serial bootloader
- TIDB 6.0新特性漫谈之Clinic
- 插件开发之国际化(i18n)
- 刘汝佳 9.2.1 硬币问题
- 批处理文件的@echo off是什么意思?
- Mysql应用安装后找不到my.ini文件
- 计算两张图像之间的PSNR和SSIM值
- dmx计算机,DMX 文件扩展名: 它是什么以及如何打开它?