我需要用c语言完成一个表达式求值算法(输入一个复杂表达式,利用数据栈和操作栈进行表达式求值)。
时间: 2023-06-12 13:03:44 浏览: 44
好的,下面是一个基于栈的表达式求值算法的示例代码,使用的是C语言:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK 50
typedef struct {
int top;
int data[MAX_STACK];
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 压入数据
void push(Stack *s, int x) {
if (s->top == MAX_STACK - 1) {
printf("Stack overflow\n");
exit(EXIT_FAILURE);
}
s->data[++(s->top)] = x;
}
// 弹出数据
int pop(Stack *s) {
if (s->top == -1) {
printf("Stack underflow\n");
exit(EXIT_FAILURE);
}
return s->data[(s->top)--];
}
// 获取栈顶数据
int top(Stack *s) {
if (s->top == -1) {
printf("Stack is empty\n");
exit(EXIT_FAILURE);
}
return s->data[s->top];
}
// 判断栈是否为空
int is_empty(Stack *s) {
return s->top == -1;
}
// 获取操作符优先级
int prec(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
default:
return -1;
}
}
// 判断字符是否为操作符
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}
// 计算表达式
int evaluate(char *exp) {
Stack val_stack, op_stack;
init(&val_stack);
init(&op_stack);
for (int i = 0; exp[i] != '\0'; i++) {
if (isspace(exp[i])) {
continue;
} else if (isdigit(exp[i])) {
int num = 0;
while (isdigit(exp[i])) {
num = num * 10 + (exp[i] - '0');
i++;
}
i--;
push(&val_stack, num);
} else if (is_operator(exp[i])) {
while (!is_empty(&op_stack) && prec(top(&op_stack)) >= prec(exp[i])) {
int val2 = pop(&val_stack);
int val1 = pop(&val_stack);
char op = pop(&op_stack);
int res;
switch (op) {
case '+':
res = val1 + val2;
break;
case '-':
res = val1 - val2;
break;
case '*':
res = val1 * val2;
break;
case '/':
res = val1 / val2;
break;
case '^':
res = 1;
for (int i = 1; i <= val2; i++) {
res *= val1;
}
break;
}
push(&val_stack, res);
}
push(&op_stack, exp[i]);
} else {
printf("Invalid character: %c\n", exp[i]);
exit(EXIT_FAILURE);
}
}
while (!is_empty(&op_stack)) {
int val2 = pop(&val_stack);
int val1 = pop(&val_stack);
char op = pop(&op_stack);
int res;
switch (op) {
case '+':
res = val1 + val2;
break;
case '-':
res = val1 - val2;
break;
case '*':
res = val1 * val2;
break;
case '/':
res = val1 / val2;
break;
case '^':
res = 1;
for (int i = 1; i <= val2; i++) {
res *= val1;
}
break;
}
push(&val_stack, res);
}
return pop(&val_stack);
}
int main() {
char exp[100];
printf("Enter an expression: ");
fgets(exp, 100, stdin);
printf("Result: %d\n", evaluate(exp));
return 0;
}
```
该算法利用两个栈分别存储操作数和操作符,并根据操作符的优先级计算表达式的值。该算法的时间复杂度为O(n),其中n为表达式的长度。