用C语言编写程序,计算一个从键盘输入的后缀表达式(四则运算)的值,并输出其值,要求用顺序栈完成
时间: 2024-10-27 11:08:05 浏览: 18
在C语言中,计算后缀表达式的值通常涉及到两个步骤:解析输入的字符串并转换成逆波兰表示法(也称为后缀表达式),然后使用栈数据结构进行求解。这里是一个简单的示例代码,展示了如何通过顺序栈实现这个过程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct {
char op; // 运算符
int num[10]; // 数字数组,存储十进制数值
int top; // 栈顶指针
} Stack;
// 判断字符是否是数字或运算符
int is_digit(char c) { return '0' <= c && c <= '9'; }
int is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; }
// 入栈操作
void push(Stack *stack, char c) {
if (is_digit(c)) {
stack->num[stack->top++] = c - '0';
} else if (is_operator(c)) {
while (!stack->top == 0 && is_operator(stack->op) && precedence(stack->op) >= precedence(c)) {
printf("%d ", stack->num[--stack->top]);
}
stack->op = c;
}
}
// 出栈操作
char pop(Stack *stack) {
if (stack->top > 0) {
if (is_operator(stack->op)) {
return stack->op++;
} else {
return stack->num[--stack->top] + '0';
}
}
return '\0'; // 如果栈为空,则返回结束标志
}
// 比较运算符的优先级
int precedence(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 计算后缀表达式的值
double evaluate_postfix(char* postfix) {
Stack s = {'.', {}, 0};
for (char *ch = postfix; *ch != '\0'; ch++) {
push(&s, *ch);
}
double result = 0;
while (pop(&s) != '\0') {
result += pop(&s) * (pop(&s) - '0');
}
return result;
}
int main() {
char input[100];
printf("请输入后缀表达式: ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0'; // 移除行尾换行符
double value = evaluate_postfix(input);
printf("表达式的值为: %f\n", value);
return 0;
}
```
在这个程序中,我们首先定义了一个顺序栈结构,包含运算符和数字数组。`push`函数用于处理输入的字符,如果是数字就直接入栈,如果是运算符则先将高于该运算符优先级的运算符出栈并计算结果,然后再入栈当前运算符。`evaluate_postfix`函数遍历输入的后缀表达式,不断出栈运算符和数字进行计算。
注意,此代码没有处理一些特殊情况,例如空栈或非法输入。在实际应用中,你可能需要添加错误检查和异常处理机制。运行此程序时,请确保给定的是有效的后缀表达式。
阅读全文