表达式求值问题 栈c语言
时间: 2023-12-19 10:06:03 浏览: 68
表达式求值(C语言栈实现)
表达式求值问题可以通过使用栈来实现。具体步骤如下:
1. 定义两个栈,一个存储操作数,一个存储运算符。
2. 从左到右扫描表达式的每个字符。
3. 如果是数字,则将其压入操作数栈。
4. 如果是运算符,则判断其优先级是否高于栈顶运算符,是则直接压入运算符栈,否则将栈顶运算符弹出并与操作数栈顶的两个数进行运算,再将结果压入操作数栈中,直到该运算符可以被压入运算符栈中。
5. 扫描完整个表达式后,将剩余的运算符依次弹出并与操作数栈顶的两个数进行运算,直到运算符栈为空。
6. 最后,操作数栈中剩余的数字即为表达式的结果。
以下是一个简单的栈实现表达式求值的示例程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
typedef struct {
int data[MAX_STACK_SIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
void push(Stack *s, int value) {
if (s->top < MAX_STACK_SIZE - 1) {
s->data[++s->top] = value;
}
}
int pop(Stack *s) {
if (s->top >= 0) {
return s->data[s->top--];
}
return -1;
}
int peek(Stack *s) {
if (s->top >= 0) {
return s->data[s->top];
}
return -1;
}
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int getPriority(char c) {
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
}
return 0;
}
int evaluateExpression(char *expr) {
Stack operandStack, operatorStack;
initStack(&operandStack);
initStack(&operatorStack);
while (*expr) {
if (isdigit(*expr)) {
int value = 0;
while (isdigit(*expr)) {
value = value * 10 + *expr - '0';
expr++;
}
push(&operandStack, value);
} else if (isOperator(*expr)) {
int priority = getPriority(*expr);
while (peek(&operatorStack) != -1 && getPriority(peek(&operatorStack)) >= priority) {
int op2 = pop(&operandStack);
int op1 = pop(&operandStack);
switch (pop(&operatorStack)) {
case '+': push(&operandStack, op1 + op2); break;
case '-': push(&operandStack, op1 - op2); break;
case '*': push(&operandStack, op1 * op2); break;
case '/': push(&operandStack, op1 / op2); break;
}
}
push(&operatorStack, *expr);
expr++;
} else {
expr++;
}
}
while (peek(&operatorStack) != -1) {
int op2 = pop(&operandStack);
int op1 = pop(&operandStack);
switch (pop(&operatorStack)) {
case '+': push(&operandStack, op1 + op2); break;
case '-': push(&operandStack, op1 - op2); break;
case '*': push(&operandStack, op1 * op2); break;
case '/': push(&operandStack, op1 / op2); break;
}
}
return pop(&operandStack);
}
int main() {
char expr[] = "2+3*4-5/2";
int result = evaluateExpression(expr);
printf("Result: %d\n", result);
return 0;
}
```
阅读全文