本文主要是介绍nyoj128 前缀式计算 (strtok分割字符串+递归),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前缀式计算
- 描述
-
先说明一下什么是中缀式:
如2+(3+4)*5这种我们最常见的式子就是中缀式。
而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))
然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )
把括号去掉就是:+ 2 * + 3 4 5
最后这个式子就是该表达式的前缀表示。
给你一个前缀表达式,请你计算出该前缀式的值。
比如:
+ 2 * + 3 4 5的值就是 37
- 输入
- 有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。 输出 - 对每组数据,输出该前缀表达式的值。输出结果保留两位小数。 样例输入
-
+ 2 * + 3 4 5 + 5.1 / 3 7
样例输出 -
37.00 5.53
来源 - 经典题目 上传者
- 张云聪
- 有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
和中缀式不同的是前缀式计算的规则是从字符串的右端向左端读取,遇到数字入栈,遇到操作符取出栈顶的元素进行计算。
可以使用栈来计算 当然也可以使用递归啦~
重要的是分割字符串 在这里我使用的是strtok方法 当然也可以使用sscanf ~
具体看代码
#include <stdio.h>
#include <queue>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <ctype.h>
using namespace std;
char str[1000];
char *temp;
const char *split=" ";//以空格分割
double a;
char oper;//操作符
void readnext()
{if(temp)temp=strtok(NULL,split);
}
double solve()
{if(isdigit(temp[0])){a=atof(temp);readnext();return a;} else{oper=temp[0];readnext();}switch(oper){case '+':return solve()+solve();break;case '-':return solve()-solve();break;case '*':return solve()*solve();break;case '/':return solve()/solve();break;}}
int main()
{while(gets(str)!=NULL){temp=strtok(str,split);printf("%.2lf\n",solve());}
}
这篇关于nyoj128 前缀式计算 (strtok分割字符串+递归)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!