C语言算法设计:从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:逆波兰表达式的长度不超过一行,以"$"作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:234 34+2*$。
时间: 2024-10-14 10:09:41 浏览: 67
C语言数据结构算法-简单表达式求值(支持计算负数及小数)
在C语言中,计算后缀表达式(也称为逆波兰表示法,RPN)的值可以采用栈的数据结构。下面是基本步骤:
1. 初始化两个指针:一个指向输入字符串,另一个用于遍历并读取数字和操作符。
2. 当遇到空格或"$"(表示输入结束)时,检查当前字符。如果是数字,将其转换为整数并压入栈;如果遇到操作符,从栈顶弹出足够的元素来进行相应的运算,并将结果压回栈中。
3. 循环处理,直到遍历完整个输入串。
4. 最终,栈顶剩下的唯一元素就是整个表达式的计算结果。
下面是一个简单的伪代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int is_digit(char c) {
return c >= '0' && c <= '9';
}
double evaluate_rpn(char *expression) {
char *input = expression;
stack_t *stack = create_stack();
double num = 0.0;
while (*input != '\0') {
if (is_digit(*input)) { // 遇到数字
while (is_digit(*input))
num = num * 10 + (*input - '0');
push(stack, num++);
} else { // 遇到操作符
double op2 = pop(stack);
double op1 = pop(stack);
switch (*input) {
case '+':
push(stack, op1 + op2);
break;
case '-':
push(stack, op1 - op2);
break;
case '*':
push(stack, op1 * op2);
break;
case '/':
if (op2 != 0)
push(stack, op1 / op2);
else
printf("Error: Division by zero.\n");
break;
}
}
input++;
}
return pop(stack);
}
int main() {
char expression[] = "2 3 4 3 4 + 2 * $";
double result = evaluate_rpn(expression);
printf("The value of the expression is: %.2f\n", result);
return 0;
}
```
阅读全文