数据结构表达式求值c语言
时间: 2023-11-03 11:06:46 浏览: 68
数据构中的表达式求值是一个常见的问题,可以使用C语言来实现。通过使用算符优先法,可以解析和计算算术表达式。算符优先法是一种基于运算符优先级的算法,用于确定操作符的顺序和操作数的计算顺序。
在C语言中,可以通过使用栈来实现算符优先法求值算法。具体步骤如下:
1. 创建两个栈,一个用于存储运算符的栈(称为操作符栈),一个用于存储操作数的栈(称为操作数栈)。
2. 从左到右扫描表达式的每个字符。
3. 如果遇到操作数(数字),则将其推入操作数栈。
4. 如果遇到操作符,则与操作符栈顶元素比较优先级:
- 如果操作符栈为空,或者操作符的优先级高于操作符栈顶元素,则将操作符推入操作符栈。
- 否则,将操作符栈顶元素弹出,同时从操作数栈中弹出两个操作数,进行计算,并将结果推入操作数栈。然后将当前操作符推入操作符栈。
5. 如果遇到左括号,则将其推入操作符栈。
6. 如果遇到右括号,则从操作符栈中弹出操作符,同时从操作数栈中弹出两个操作数,进行计算,并将结果推入操作数栈,直到遇到左括号为止。
7. 重复步骤2-6,直到表达式的所有字符扫描完毕。
8. 最后,将操作符栈中的操作符依次弹出,同时从操作数栈中弹出两个操作数,进行计算,并将结果推入操作数栈,直到操作符栈为空。
9. 最终,操作数栈中的唯一元素即为表达式的求值结果。
这样,就可以通过C语言实现对表达式的求值。
相关问题
数据结构表达式求值C语言代码
#include <stdio.h>
#include <stdlib.h>
// 定义栈结构体
typedef struct {
int top;
int *data;
} Stack;
// 初始化栈
void initStack(Stack *s, int size) {
s->top = -1;
s->data = (int *)malloc(size * sizeof(int));
}
// 入栈
void push(Stack *s, int x) {
s->top++;
s->data[s->top] = x;
}
// 出栈
int pop(Stack *s) {
int x = s->data[s->top];
s->top--;
return x;
}
// 获取栈顶元素
int peek(Stack *s) {
return s->data[s->top];
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 判断当前字符是否为数字
int isDigit(char c) {
return c >= '0' && c <= '9';
}
// 判断当前字符是否为操作符
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 获取操作符的优先级
int getPriority(char c) {
if (c == '*' || c == '/') {
return 2;
} else if (c == '+' || c == '-') {
return 1;
} else {
return 0;
}
}
// 对表达式进行求值
int evaluate(char *expression) {
Stack *numberStack = (Stack *)malloc(sizeof(Stack));
Stack *operatorStack = (Stack *)malloc(sizeof(Stack));
initStack(numberStack, strlen(expression));
initStack(operatorStack, strlen(expression));
int i = 0;
while (expression[i] != '\0') {
if (isDigit(expression[i])) {
int number = 0;
while (isDigit(expression[i])) {
number = number * 10 + (expression[i] - '0');
i++;
}
push(numberStack, number);
} else if (isOperator(expression[i])) {
while (!isEmpty(operatorStack) && getPriority(peek(operatorStack)) >= getPriority(expression[i])) {
int b = pop(numberStack);
int a = pop(numberStack);
char op = pop(operatorStack);
int result;
if (op == '+') {
result = a + b;
} else if (op == '-') {
result = a - b;
} else if (op == '*') {
result = a * b;
} else {
result = a / b;
}
push(numberStack, result);
}
push(operatorStack, expression[i]);
i++;
} else {
i++;
}
}
while (!isEmpty(operatorStack)) {
int b = pop(numberStack);
int a = pop(numberStack);
char op = pop(operatorStack);
int result;
if (op == '+') {
result = a + b;
} else if (op == '-') {
result = a - b;
} else if (op == '*') {
result = a * b;
} else {
result = a / b;
}
push(numberStack, result);
}
int result = pop(numberStack);
free(numberStack);
free(operatorStack);
return result;
}
int main() {
char expression[100];
printf("请输入表达式:");
scanf("%s", expression);
int result = evaluate(expression);
printf("表达式的值为:%d\n", result);
return 0;
}
数据结构实现表达式求值c语言
在C语言中,可以使用栈来实现表达式求值。具体步骤如下:
1. 定义两个栈,一个用于存储操作数,一个用于存储运算符。
2. 从左到右遍历表达式中的每个元素,如果是操作数,则将其压入操作数栈中;如果是运算符,则将其与运算符栈顶元素进行比较,如果优先级较高,则将其压入运算符栈中;否则,将运算符栈顶元素弹出,与操作数栈顶的两个元素进行运算,并将结果压入操作数栈中,直到当前运算符可以压入运算符栈中。
3. 当表达式遍历完毕后,如果运算符栈中还有元素,则依次弹出运算符栈顶元素,并将操作数栈顶的两个元素进行运算,并将结果压入操作数栈中,直到运算符栈为空。
4. 最终,操作数栈中只剩下一个元素,即为表达式的值。
下面是一个简单的实现示例:
```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 overflow\n");
exit(1);
}
s->data[++s->top] = x;
}
int pop(Stack *s) {
if (is_empty(s)) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top--];
}
int peek(Stack *s) {
if (is_empty(s)) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top];
}
int priority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
default:
printf("Invalid operator: %c\n", op);
exit(1);
}
}
int evaluate(char *expr) {
Stack opnd, optr;
init(&opnd);
init(&optr);
while (*expr) {
if (isdigit(*expr)) {
int num = 0;
while (isdigit(*expr)) {
num = num * 10 + (*expr - '0');
expr++;
}
push(&opnd, num);
} else if (*expr == '(') {
push(&optr, '(');
expr++;
} else if (*expr == ')') {
while (peek(&optr) != '(') {
char op = pop(&optr);
int b = pop(&opnd);
int a = pop(&opnd);
switch (op) {
case '+':
push(&opnd, a + b);
break;
case '-':
push(&opnd, a - b);
break;
case '*':
push(&opnd, a * b);
break;
case '/':
push(&opnd, a / b);
break;
}
}
pop(&optr);
expr++;
} else if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '/') {
while (!is_empty(&optr) && priority(*expr) <= priority(peek(&optr))) {
char op = pop(&optr);
int b = pop(&opnd);
int a = pop(&opnd);
switch (op) {
case '+':
push(&opnd, a + b);
break;
case '-':
push(&opnd, a - b);
break;
case '*':
push(&opnd, a * b);
break;
case '/':
push(&opnd, a / b);
break;
}
}
push(&optr, *expr);
expr++;
} else {
printf("Invalid character: %c\n", *expr);
exit(1);
}
}
while (!is_empty(&optr)) {
char op = pop(&optr);
int b = pop(&opnd);
int a = pop(&opnd);
switch (op) {
case '+':
push(&opnd, a + b);
break;
case '-':
push(&opnd, a - b);
break;
case '*':
push(&opnd, a * b);
break;
case '/':
push(&opnd, a / b);
break;
}
}
return pop(&opnd);
}
int main() {
char expr[MAX_SIZE];
printf("Enter an expression: ");
scanf("%s", expr);
int result = evaluate(expr);
printf("Result: %d\n", result);
return 0;
}
```