波兰表达式求解

波兰表达式

波兰表达式是一种把运算符前置的算术表达式。
例如普通的表达式2+3的逆波兰表示法为+ 2 3。
波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序。
例如(2+3)4的逆波兰表达法为 + 2 3 4。
本题求解逆波兰表达式的值, 其中运算符包括+、-、*、/四个.

输入格式: 1行, 其中运算符和运算数之间都用空格分隔, 运算数是浮点数。
输出格式: 1行, 表达式的值. 可直接用printf(“%f\n”,v)输出表达式的值v。
提示: 可使用atof(str)把字符串转换为一个double类型的浮点数. atof定义在math.h中。

输入样例输出样例
* + 11.0 12.0 + 24.0 35.01357.000000
+ 1 + 2 + 3 + 4 515.000000
+ + + 1 2 + 3 4 + 5 621.000000

分析

  1. 不断从左到右扫描表达式,如果连续遇到两个操作数,则与前一个操作符进行计算,并将计算结果作为操作数代替。
  2. 从右向左扫描表达式,用栈存储遇到的操作数,若遇到操作符,则从栈中拿出两个数进行计算,再将计算结果压入栈中,扫描结束后,栈顶元素即为结果。
  3. 波兰表达式具有递归性质,一个波兰表达式本身就是由一个或多个波兰表达式组成。
#include <bits/stdc++.h>
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);
    }
}

int main()
{
    printf("%0.6f",exp());
    return 0;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
波兰表达式求值是一种常见的数学表达式求解方法。在C语言中,可以通过使用栈来实现波兰表达式的求值。 首先,将波兰表达式转换为后缀表达式。然后,使用栈来存储运算数,并按照后缀表达式的顺序依次计算运算符。具体步骤如下: 1. 创建一个空栈用于存储运算数。 2. 从左到右遍历后缀表达式的每个元素。 3. 若当前元素是运算符,从栈中弹出两个运算数,并根据该运算符进行计算。将计算结果压入栈中。 4. 若当前元素是运算数,则将其压入栈中。 5. 重复步骤2~4,直到遍历完后缀表达式。 6. 栈中最终剩下的元素即为表达式的求值结果。 下面是一个示例程序实现波兰表达式求值的过程: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define STACK_SIZE 100 typedef struct { int data[STACK_SIZE]; int top; } Stack; void initStack(Stack *stack) { stack->top = -1; } int isEmpty(Stack *stack) { return stack->top == -1; } void push(Stack *stack, int value) { if (stack->top == STACK_SIZE - 1) { printf("Stack overflow!\n"); exit(1); } stack->data[++stack->top] = value; } int pop(Stack *stack) { if (isEmpty(stack)) { printf("Stack underflow!\n"); exit(1); } return stack->data[stack->top--]; } int evaluate(char *expression) { Stack stack; int len = strlen(expression); initStack(&stack); for (int i = 0; i < len; i++) { if (expression[i] >= '0' && expression[i] <= '9') { push(&stack, expression[i] - '0'); } else { int operand2 = pop(&stack); int operand1 = pop(&stack); int result; switch (expression[i]) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; default: printf("Invalid operator!\n"); exit(1); } push(&stack, result); } } return pop(&stack); } int main() { char expression[STACK_SIZE]; printf("请输入波兰表达式:"); fgets(expression, STACK_SIZE, stdin); // 去除末尾的换行符 if (expression[strlen(expression) - 1] == '\n') { expression[strlen(expression) - 1] = '\0'; } int result = evaluate(expression); printf("表达式的求值结果为:%d\n", result); return 0; } ``` 你可以根据自己的需要修改表达式的输入方式,例如从命令行参数或文件中读取。运行程序后,输入波兰表达式即可得到求值结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值