数据结构c实现表达式计算
时间: 2023-11-26 16:44:08 浏览: 31
好的,关于数据结构C实现表达式计算,可以使用栈来实现。具体步骤如下:
1. 定义两个栈,一个用来存储操作数,一个用来存储操作符。
2. 从左到右遍历表达式中的每个字符。
3. 如果当前字符是数字,则将其转换为数字并压入操作数栈中。
4. 如果当前字符是操作符,则将其压入操作符栈中。
5. 如果当前字符是右括号,则弹出操作符栈中的操作符,并弹出操作数栈中的两个操作数进行计算,将计算结果压入操作数栈中,直到遇到左括号为止。
6. 遍历完整个表达式后,如果操作符栈不为空,则依次弹出操作符并弹出操作数栈中的两个操作数进行计算,将计算结果压入操作数栈中。
7. 最终操作数栈中剩下的就是表达式的计算结果。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
int is_empty(Stack *s) {
return s->top == -1;
}
int is_full(Stack *s) {
return s->top == MAX_SIZE - 1;
}
void push(Stack *s, int x) {
if (is_full(s)) {
printf("Stack is full.\n");
exit(1);
}
s->data[++s->top] = x;
}
int pop(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
exit(1);
}
return s->data[s->top--];
}
int peek(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
exit(1);
}
return s->data[s->top];
}
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int precedence(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
int evaluate(char *expr) {
Stack operand_stack, operator_stack;
init(&operand_stack);
init(&operator_stack);
while (*expr != '\0') {
if (isdigit(*expr)) {
int num = 0;
while (isdigit(*expr)) {
num = num * 10 + (*expr - '0');
expr++;
}
push(&operand_stack, num);
} else if (is_operator(*expr)) {
while (!is_empty(&operator_stack) && precedence(peek(&operator_stack)) >= precedence(*expr)) {
int op = pop(&operator_stack);
int b = pop(&operand_stack);
int a = pop(&operand_stack);