如何用C语言输入表达式输出结果
用C语言输入表达式并输出结果,主要有以下几种方法:使用递归下降解析法、使用栈实现中缀表达式转后缀表达式并计算、使用现有的库函数。其中,栈实现中缀转后缀并计算这一方法比较常见且实用。
一、递归下降解析法
递归下降解析法是一种自顶向下的解析方法,利用递归函数来解析表达式。每个非终结符号对应一个函数,这些函数在解析过程中调用自身或其他函数。
1、基本原理
递归下降解析法通过一组递归函数来解析输入的表达式。每个函数对应一个语法规则,并尝试匹配输入的部分。如果匹配成功,函数返回相应的解析结果。
2、实现步骤
- 定义语法规则:例如,表达式 (E) 可以由项 (T) 和运算符 (+, -) 构成,项 (T) 可以由因子 (F) 和运算符 (*, /) 构成,因子 (F) 可以是一个数字或括号中的表达式。
- 编写递归函数:为每个语法规则编写相应的递归函数。例如,
expr()
解析表达式,term()
解析项,factor()
解析因子。 - 处理输入和错误检测:解析过程中需要处理输入字符串,并进行错误检测。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char *input;
int expr();
int term();
int factor();
int main() {
input = "(2+3)*(5-2)";
printf("Result: %dn", expr());
return 0;
}
int expr() {
int result = term();
while (*input == '+' || *input == '-') {
char op = *input++;
if (op == '+') {
result += term();
} else {
result -= term();
}
}
return result;
}
int term() {
int result = factor();
while (*input == '*' || *input == '/') {
char op = *input++;
if (op == '*') {
result *= factor();
} else {
result /= factor();
}
}
return result;
}
int factor() {
int result = 0;
if (*input == '(') {
input++;
result = expr();
input++;
} else {
while (isdigit(*input)) {
result = result * 10 + (*input++ - '0');
}
}
return result;
}
二、使用栈实现中缀表达式转后缀表达式并计算
栈是一种数据结构,具有后进先出的特点。使用两个栈,一个存储操作数,一个存储操作符,可以实现中缀表达式转后缀表达式,并对后缀表达式进行计算。
1、基本原理
- 中缀转后缀:遍历中缀表达式,根据优先级将操作符压入栈中,遇到操作数直接输出。当遇到更高优先级的操作符或括号时,将栈中的操作符弹出并输出。
- 计算后缀表达式:遍历后缀表达式,遇到操作数压入栈中,遇到操作符弹出两个操作数进行计算,并将结果压入栈中。
2、实现步骤
- 定义优先级规则:定义操作符的优先级,括号优先级最高。
- 中缀转后缀:编写函数将中缀表达式转为后缀表达式。
- 计算后缀表达式:编写函数计算后缀表达式的值。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAXSTACK 100
#define MAXEXPR 100
typedef struct {
char items[MAXSTACK];
int top;
} Stack;
void push(Stack *s, char item) {
if (s->top < MAXSTACK - 1) {
s->items[++s->top] = item;
}
}
char pop(Stack *s) {
if (s->top >= 0) {
return s->items[s->top--];
}
return '