C语言算术表达式求值(支持多位整数、小数、括号嵌套和后缀表达式)
C语言算术表达式求值
这篇文章提供了一个C语言实现的算术表达式求值程序,它可以处理:
- 多位整数的表达式计算
- 小数的表达式运算
- 括号嵌套的表达式运算
- 后缀表达式的转换和输出
- 采用后缀表达式进行计算
代码示例
#define MAX_STACK_SIZE 100
typedef struct { double data[MAX_STACK_SIZE]; int top;} Stack;
void initStack(Stack *stack) { stack->top = -1;}
int isStackEmpty(Stack *stack) { return stack->top == -1;}
int isStackFull(Stack *stack) { return stack->top == MAX_STACK_SIZE - 1;}
void push(Stack *stack, double value) { if (isStackFull(stack)) { printf("Stack is full!\n"); exit(1); } stack->data[++stack->top] = value;}
double pop(Stack *stack) { if (isStackEmpty(stack)) { printf("Stack is empty!\n"); exit(1); } return stack->data[stack->top--];}
double calculate(double num1, double num2, char operator) { switch (operator) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; default: printf("Invalid operator!\n"); exit(1); }}
double evaluateExpression(char *expression) { Stack operandStack; initStack(&operandStack);
Stack operatorStack; initStack(&operatorStack);
int i = 0; while (expression[i] != '\0') { if (isdigit(expression[i]) || expression[i] == '.') { double num = atof(&expression[i]); push(&operandStack, num); while (isdigit(expression[i]) || expression[i] == '.') { i++; } } else if (expression[i] == '(') { push(&operatorStack, '('); i++; } else if (expression[i] == ')') { while (!isStackEmpty(&operatorStack) && operatorStack.data[operatorStack.top] != '(') { double num2 = pop(&operandStack); double num1 = pop(&operandStack); char operator = (char) pop(&operatorStack); double result = calculate(num1, num2, operator); push(&operandStack, result); } if (!isStackEmpty(&operatorStack) && operatorStack.data[operatorStack.top] == '(') { pop(&operatorStack); } i++; } else if (expression[i] == '+' || expression[i] == '-') { while (!isStackEmpty(&operatorStack) && operatorStack.data[operatorStack.top] != '(') { double num2 = pop(&operandStack); double num1 = pop(&operandStack); char operator = (char) pop(&operatorStack); double result = calculate(num1, num2, operator); push(&operandStack, result); } push(&operatorStack, expression[i]); i++; } else if (expression[i] == '*' || expression[i] == '/') { while (!isStackEmpty(&operatorStack) && (operatorStack.data[operatorStack.top] == '*' || operatorStack.data[operatorStack.top] == '/')) { double num2 = pop(&operandStack); double num1 = pop(&operandStack); char operator = (char) pop(&operatorStack); double result = calculate(num1, num2, operator); push(&operandStack, result); } push(&operatorStack, expression[i]); i++; } else { printf("Invalid character in expression!\n"); exit(1); } }
while (!isStackEmpty(&operatorStack)) { double num2 = pop(&operandStack); double num1 = pop(&operandStack); char operator = (char) pop(&operatorStack); double result = calculate(num1, num2, operator); push(&operandStack, result); }
return pop(&operandStack);}
int main() { char expression[100]; printf("Enter an arithmetic expression: "); scanf("%s", expression);
double result = evaluateExpression(expression); printf("Result: %f\n", result);
return 0;}
## 代码解析
这段代码实现了一个基本的算术表达式求值功能,使用了两个栈:
* **operandStack**: 用于存储操作数* **operatorStack**: 用于存储运算符
程序遍历输入的表达式,根据运算符的优先级和括号的位置,将操作数和运算符分别入栈和出栈,最终得到结果。
## 示例
**输入:**
Enter an arithmetic expression: (2 + 3) * 4 - 5 / 2
**输出:**
Result: 18.500000
原文地址: https://www.cveoy.top/t/topic/eqM 著作权归作者所有。请勿转载和采集!