前缀表达式递归算法

1.atof()的作用

atof()它可以将字符串换成浮点型数,会扫描参数字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时才结束转换,并将结果返回。

2.代码演示

2.1法一

题目描述:请编程实现递归算法,对前缀表达式求值。 简化约定:前缀表达式串中,操作数均为一位无符号整数,仅支持四则整数运算。 输入:+3*45 输出:23

#include <iostream>
#include <cstdlib>

using namespace std;

double exp()
{
    char s[20];
    cin>>s;
    switch(s[0])
    {
        case '+': return exp()+exp();
        case '-': return exp()-exp();
        case '*': return exp()*exp();
        case '/': return exp()/exp();
        default: return atof(s);
        break;
    }
}

int main()
{
    cout<<exp();
    return 0;
}

输入:+ 3 * 4 5

输出:23

2.2法二

#include<iostream>
#include<cstring>
using   namespace  std;
char  a[100];
int  i;
int  eval()
{
     int  x=0;
     while (a[i]==' ')i++;
     if (a[i] == '+')
    {
        i++;
         return  eval()+eval();
    }
     if (a[i] == '*')
    {
        i++;
         return  eval()*eval();
    }
     while ((a[i] >= '0')&&(a[i]<= '9'))
       x = 10*x +a[i++]-'0';
     return  x;
}
int  main()
{
    gets(a);
    cout<< eval()<<endl;
     return  0;
} 

2.3法三

#include <iostream>
#include <cstdlib>
using namespace std; 
double Evalue(const string &a,int i=0)//输入的字符串a和其位移i 
{
	if(a[i]=='+')
		return Evalue(a,i+1)+Evalue(a,i+2);//跳过此符号将式子的后两个数相加 
	else if(a[i]=='-')
		return Evalue(a,i+1)-Evalue(a,i+2);//跳过此符号将式子的后两个数相减 
	else if(a[i]=='*')
		return Evalue(a,i+1)*Evalue(a,i+2);//跳过此符号将式子的后两个数相乘 
	else if(a[i]=='/')
		return Evalue(a,i+1)/Evalue(a,i+2);//跳过此符号将式子的后两个数相除 
	else
		return a[i]-'0';//只剩数字,不用继续运算时,将字符a转换为数字结果 
}
int main() {
    string a;//字符串a 
	cin>>a;
	cout<<Evalue(a);//输出计算后的结果 
	return 0;
}
#include <iostream>
#include <cstdlib>
using namespace std;
double Evalue(const string &a,int i=0)
{
	switch(a[i])
	{
	case '+': return Evalue(a,i+1)+Evalue(a,i+2);
	case '-': return Evalue(a,i+1)-Evalue(a,i+2);
	case '*': return Evalue(a,i+1)*Evalue(a,i+2);
	case '/': return Evalue(a,i+1)/Evalue(a,i+2);
	default : return a[i]-'0';
	}
}
int main() {
    string a;
	cin>>a;
	cout<<Evalue(a);
	return 0;
}

输入:+3*45

输出:23

法一二和法三的主要区别在于输入中是否包含空格

法三的两种方法分别用switch case和if else展示

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值