C语言算术表达式求值

这篇文章提供了一个C语言实现的算术表达式求值程序,它可以处理:

  1. 多位整数的表达式计算
  2. 小数的表达式运算
  3. 括号嵌套的表达式运算
  4. 后缀表达式的转换和输出
  5. 采用后缀表达式进行计算

代码示例


#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
C语言算术表达式求值(支持多位整数、小数、括号嵌套和后缀表达式)

原文地址: https://www.cveoy.top/t/topic/eqM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录