C/C++ 算法 中缀转前缀表达式实现1---实现浮点数的加减乘除四则算数(包括浮点数运算,包括括号)
来源:互联网 发布:数据库通配符 编辑:程序博客网 时间:2024/04/30 08:35
C/C++ 算法 中缀转前缀表达式实现1---实现浮点数的加减乘除四则算数(包括浮点数运算,包括括号)
如,输入:1+((2+3)*4)-5,输出前缀表达式:- + 1 * + 2 3 4 5,计算结果等于:16
代码如下:
#include<stack>#include<cstring>#include<iostream>using namespace std;void reverse(char polish[]);bool isoperator(char ch);int priority(char ch);double getpolish_value(char polish[]);void infix_to_polish(char infix[],char polish[]);int main(){char infix[]="1+((2+3)*4)-5";char polish[1024];cout<<infix<<endl;infix_to_polish(infix,polish);cout<<polish<<endl;double result=getpolish_value(polish);cout<<result<<endl;return 0;}void reverse(char str[]){for(int i=0,j=strlen(str)-1;i<j;i++,j--){char ch=str[i];str[i]=str[j];str[j]=ch;}}bool isoperator(char ch){switch(ch){case '+':case '-':case '*':case '/':return true;default:return false;}}int priority(char ch){switch(ch){case ')':return 0;case '+':case '-':return 1;case '*':case '/':return 2;default:return -1;}}void infix_to_polish(char infix[],char polish[]){//从右往左扫描reverse(infix);stack<char> s1;s1.push('#');int i=0,j=0;while(infix[i]!='\0'){if((infix[i]>='0'&&infix[i]<='9')||infix[i]=='.'){polish[j++]=infix[i];}else if(infix[i]==')'){s1.push(infix[i]);}else if(infix[i]=='('){while(s1.top()!=')'){polish[j++]=' ';polish[j++]=s1.top();s1.pop();}s1.pop();}else if(isoperator(infix[i])){polish[j++]=' ';if(s1.empty()){s1.push(polish[i]);}else{if(priority(infix[i])<priority(s1.top())){polish[j++]=s1.top();polish[j++]=' ';s1.pop();}s1.push(infix[i]);}}i++;}while(s1.size()){polish[j++]=' ';polish[j++]=s1.top();s1.pop();}polish[j-1]='\0';reverse(polish);}double getpolish_value(char polish[]){reverse(polish);stack<double> s1;int i=0;double result=0;double x1=0,x2=0;while(polish[i]!='\0'){if(polish[i]>='0'&&polish[i]<='9'){double x=0;int n=0;while(polish[i]>='0'&&polish[i]<='9'){x=x*10+(polish[i]-'0');i++;}if(polish[i]=='.'){i++;while(polish[i]>='0'&&polish[i]<='9'){x=x*10+(polish[i]-'0');i++;n++;}}while(n){x/=10;n--;}s1.push(x);}else if(polish[i]==' '){i++;}else if(polish[i]=='+'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1+x2;s1.push(temp);i++;}else if(polish[i]=='-'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1-x2;s1.push(temp);i++;}else if(polish[i]=='*'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1*x2;s1.push(temp);i++;}else if(polish[i]=='+'){x1=s1.top();s1.pop();x2=s1.top();s1.pop();double temp=x1/x2;s1.push(temp);i++;}}result=s1.top();return result;}
运行结果:
0 0
- C/C++ 算法 中缀转前缀表达式实现1---实现浮点数的加减乘除四则算数(包括浮点数运算,包括括号)
- C/C++ 算法 中缀转后缀表达式实现3---实现加减乘除四则算数(包括浮点数运算,包括括号)
- C/C++ 算法 中缀转后缀表达式实现2---实现加减乘除四则算数(整型,包括括号)
- 精确的浮点数运算包括加减乘除和四舍五入
- 表达式求值(C实现,实现多括号,浮点数)---栈的实现以及运用。
- [java]运算工具(提供精确的浮点数运算,包括加减乘除和四舍五入)
- 用c语言实现 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- C 将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- 大数的乘法(包括浮点数)
- c浮点数运算
- 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入
- 一个非常酷的Js计算器(加减乘除,浮点,以及括号运算,四则混合运算)
- 浮点数的加减乘除运算步骤
- C语言中浮点数的运算
- 【C语言模拟实现】浮点数-转-定点数
- 【C语言】将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- C语言 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- 【c语言】编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)
- Google APAC 2016 University Graduates Test Round A解题报告
- 组合索引适用的情况
- HTTP请求报文和HTTP响应报文
- 纹理特征分析的灰度共生矩阵(GLCM)
- C语言基础知识之(六):数组-----数组类型、定义数组、读取数组、排序数组、字符串数组函数
- C/C++ 算法 中缀转前缀表达式实现1---实现浮点数的加减乘除四则算数(包括浮点数运算,包括括号)
- hdu4219-Buildings(2012chengdu online I题)(贪心)
- Two ways to load mysql tables into hdfs via spark
- "abc" full arrange - II
- 国际减灾战略委员会
- 类之间的关系
- Python 动态生成变量名
- python celery(任务调度器)
- Android 百度地图开发 应用到自己的项目中