简单算术表达式求值c语言
时间: 2023-05-25 15:06:10 浏览: 72
这道题可以使用栈来解决。当遇到数字时,将其压入栈中;当遇到操作符时,从栈中取出两个数字进行计算,将计算结果再次压入栈中。
具体步骤如下:
1. 定义一个栈和一个指针,指向字符串的开头。
2. 从左到右遍历字符串,如果遇到数字,将其转化为数字并压入栈中;如果遇到操作符,则从栈中取出两个数字进行计算,将计算结果压入栈中。
3. 最后栈中剩下的数字即为表达式的值。
C语言代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STACK_SIZE 20
// 定义栈
typedef struct {
int top; // 栈顶指针
int data[MAX_STACK_SIZE]; // 栈元素数组
} stack;
// 初始化栈
void init_stack(stack *s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty(stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int is_full(stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 入栈
void push(stack *s, int x) {
if(is_full(s)) {
printf("Error: Stack is full!\n");
exit(1);
}
s->data[++s->top] = x;
}
// 出栈
int pop(stack *s) {
if(is_empty(s)) {
printf("Error: Stack is empty!\n");
exit(1);
}
return s->data[s->top--];
}
// 获取栈顶元素
int top(stack *s) {
if(is_empty(s)) {
printf("Error: Stack is empty!\n");
exit(1);
}
return s->data[s->top];
}
// 判断是否为操作符
int is_operator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
// 计算两个数字的结果
int eval(int x, int y, char op) {
switch(op) {
case '+':
return x + y;
case '-':
return x - y;
case '*':
return x * y;
case '/':
return x / y;
default:
printf("Error: Invalid operator!\n");
exit(1);
}
}
// 计算表达式的值
int evaluate(char *expr) {
stack s;
init_stack(&s);
int i = 0, n = strlen(expr);
while(i < n) {
if(isdigit(expr[i])) { // 如果是数字
int x = 0;
while(i < n && isdigit(expr[i])) {
x = x * 10 + (expr[i] - '0');
i++;
}
push(&s, x); // 将数字入栈
}
else if(is_operator(expr[i])) { // 如果是操作符
int y = pop(&s); // 取出栈顶两个数字
int x = pop(&s);
int res = eval(x, y, expr[i]); // 计算结果
push(&s, res); // 将结果入栈
i++;
}
else { // 如果是空格或其他字符,直接跳过
i++;
}
}
return pop(&s); // 最后栈中剩下的数字即为表达式的值
}
int main() {
char expr[MAX_STACK_SIZE];
printf("Input an arithmetic expression: ");
gets(expr);
int res = evaluate(expr);
printf("Result: %d\n", res);
return 0;
}