用c语言写出算数表达式求值
时间: 2023-09-01 10:11:03 浏览: 121
以下是用C语言实现算术表达式求值的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_SIZE 100
// 定义一个栈结构体
typedef struct {
int top; // 栈顶指针
int data[MAX_SIZE]; // 栈数据
} 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 is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 判断操作符优先级
int precedence(char c) {
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
return 0;
}
}
// 计算两个数的结果
int calculate(int a, int b, char op) {
int result = 0;
switch(op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b == 0) {
printf("Error: division by zero!\n");
exit(1);
}
result = a / b;
break;
default:
printf("Error: invalid operator!\n");
exit(1);
}
return result;
}
// 计算算术表达式的结果
int evaluate(char *expr) {
Stack op_stack; // 操作符栈
Stack val_stack; // 数字栈
init(&op_stack);
init(&val_stack);
int len = strlen(expr);
int i, j, k, num, a, b, result;
char c, op;
for (i = 0; i < len; i++) {
c = expr[i];
if (isdigit(c)) {
// 如果是数字,则一直读取到下一个非数字字符
num = 0;
j = i;
while (isdigit(expr[j])) {
num = num * 10 + (expr[j] - '0');
j++;
}
i = j - 1;
push(&val_stack, num);
} else if (is_operator(c)) {
// 如果是操作符,则将其与操作符栈顶元素比较优先级
while (!is_empty(&op_stack) && precedence(c) <= precedence(peek(&op_stack))) {
a = pop(&val_stack);
b = pop(&val_stack);
op = pop(&op_stack);
result = calculate(b, a, op);
push(&val_stack, result);
}
push(&op_stack, c);
} else if (c == '(') {
push(&op_stack, c);
} else if (c == ')') {
// 如果是右括号,则计算括号内的表达式结果
while (peek(&op_stack) != '(') {
a = pop(&val_stack);
b = pop(&val_stack);
op = pop(&op_stack);
result = calculate(b, a, op);
push(&val_stack, result);
}
pop(&op_stack);
} else {
printf("Error: invalid character!\n");
exit(1);
}
}
// 处理剩余的操作符
while (!is_empty(&op_stack)) {
a = pop(&val_stack);
b = pop(&val_stack);
op = pop(&op_stack);
result = calculate(b, a, op);
push(&val_stack, result);
}
// 返回最终结果
return pop(&val_stack);
}
int main() {
char expr[MAX_SIZE];
printf("Enter an arithmetic expression: ");
fgets(expr, MAX_SIZE, stdin);
int result = evaluate(expr);
printf("Result: %d\n", result);
return 0;
}
```
示例输入:
```
(1+2)*3-4/2
```
示例输出:
```
Result: 7
```
阅读全文