百炼-2694-逆波兰表达式-C语言-递归

本文介绍了一个使用递归方法解析逆波兰表达式的C语言程序。该程序能够读取字符串形式的逆波兰表达式,并根据运算符对后续的两个表达式进行相应计算。文章通过具体的代码实现展示了如何使用atof函数转换数字以及如何处理加、减、乘、除四种基本运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道有趣的递归问题。

/********************************************
**文件名:百炼-2694
**Copyright (c) 2015-2025 OrdinaryCrazy
**创建人: OrdinaryCrazy
**日期:20170806
**描述:百炼-2694参考答案
**版本:1.0
*********************************************/
#include <stdio.h>
#include <stdlib.h>
/********************************************
根据逆波兰表达式的定义进行递归求解
当输入一个字符串时,有2种情况:
1,字符串是一个数字,则使用atof(char*)函数转化为浮点数输出
2,字符串是一个运算符,则对其后的两个表达式进行相应的运算,输出运算结果
还有atof函数的定义在stdlib.h里
*********************************************/
double solve(void)
{
    char a[10];
    scanf("%s",a);
    switch(a[0])
    {
        case '+' : return solve() + solve();
        case '-' : return solve() - solve();
        case '*' : return solve() * solve();
        case '/' : return solve() / solve();
        default : return atof(a);
    }
}

int main()
{
    printf("%f\n",solve());
    return 0;
}


逆波兰表达式,也称为后缀表达式,是一种无需使用括号就能明确表示运算顺序的数学表达式表示方式。在C语言中,可以使用递归算法来解析和计算这种类型的表达式。下面是一个简单的递归函数示例,用于处理逆波兰表达式的求值: ```c #include <stdio.h> #include <stdlib.h> // 定义操作数栈 #define MAX_STACK_SIZE 100 int stack[MAX_STACK_SIZE]; int top = -1; // 单元操作,如加减乘除 double operate(char op, double a, double b) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; // 需要考虑除数为零的情况 default: return 0; // 如果遇到未知操作符,通常返回错误 } } // 递归函数,处理逆波兰表达式的计算 double evalPostfix(char* tokens, int n) { if (n <= 0) return 0; // 栈空或只剩下一个操作数,直接返回 char op = tokens[n-1]; // 取出最后一个字符作为操作符 double val2 = evalPostfix(tokens, n-2); // 递归处理第二个操作数 double val1 = top >= 0 ? stack[top--] : 0; // 弹出栈顶的操作数 stack[top+1] = operate(op, val1, val2); // 计算结果并入栈 return top >= 0 ? stack[top++] : 0; // 返回当前栈顶元素,处理剩余的栈顶元素 } // 主函数测试 int main() { char* postfix = "2 3 + 4 *"; // 示例逆波兰表达式 int token_count = strlen(postfix); for (int i = 0; i < token_count; ++i) { if (isdigit(postfix[i])) { stack[++top] = postfix[i] - '0'; // 将数字压入栈 } else { stack[top+1] = evalPostfix(postfix + i + 1, token_count - (i + 1)); // 调用递归处理操作符 i--; // 回溯到上一个位置,因为刚刚处理了操作符 } } printf("计算结果: %lf\n", stack[top]); return 0; } ``` 在这个例子中,`evalPostfix`函数负责处理逆波兰表达式,它会根据操作符不断从栈中弹出操作数并计算结果,直到所有操作完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值