用c语言实现:用栈完成从键盘输入一个算数表达式,完成用中缀表示法的表达式求值,其中表达式中数字可以为一位数,表达式中的符号包括加、减、乘、除、小括号。最后写出实验思路及实验结果。
时间: 2024-01-22 07:18:47 浏览: 74
c语言算术表达式,加减乘除、乘方、括号。依次输出在求值过程中运算数栈内的栈顶数据变化过程,并最终输出表达式的值
5星 · 资源好评率100%
实验思路:
1.定义一个栈结构体,包括栈底指针、栈顶指针和栈的大小。
2.定义一个字符类型的数组,用于存储从键盘输入的中缀表达式。
3.定义一个数字类型的栈,用于存储中间结果。
4.遍历中缀表达式的每一个字符,如果是数字,则直接入栈;如果是运算符,则判断其优先级与栈顶运算符的优先级,如果比栈顶运算符优先级高,则直接入栈;否则,将栈顶运算符弹出,并对栈顶两个数字进行计算,将计算结果入栈,直到栈顶运算符优先级小于当前运算符或栈为空,此时将当前运算符入栈。
5.当中缀表达式遍历完毕后,依次将栈中剩余运算符弹出,并对栈顶两个数字进行计算,将计算结果入栈。
6.最终栈中只剩下一个数字,即为中缀表达式的计算结果。
实验结果:
假设输入的中缀表达式为:(3+2)*5-6/2
程序输出的结果为:23.0
具体实现可以参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
double *base; // 栈底指针
double *top; // 栈顶指针
int size; // 栈的大小
} Stack;
void init(Stack *s) {
s->base = (double *)malloc(MAX_SIZE * sizeof(double));
s->top = s->base;
s->size = MAX_SIZE;
}
void push(Stack *s, double x) {
if (s->top - s->base == s->size) {
printf("Stack overflow!\n");
exit(1);
}
*s->top++ = x;
}
double pop(Stack *s) {
if (s->top == s->base) {
printf("Stack underflow!\n");
exit(1);
}
return *--s->top;
}
double top(Stack *s) {
if (s->top == s->base) {
printf("Stack empty!\n");
exit(1);
}
return *(s->top - 1);
}
int is_empty(Stack *s) {
return s->top == s->base;
}
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int priority(char c) {
if (c == '+' || c == '-')
return 1;
else if (c == '*' || c == '/')
return 2;
else
return 0;
}
double calculate(double x, char op, double y) {
switch (op) {
case '+': return x + y;
case '-': return x - y;
case '*': return x * y;
case '/': return x / y;
default: return 0.0;
}
}
double evaluate(char *expr) {
Stack num_stack;
init(&num_stack);
Stack op_stack;
init(&op_stack);
int i = 0;
while (expr[i] != '\0') {
if (isdigit(expr[i])) {
double num = expr[i] - '0';
push(&num_stack, num);
} else if (is_operator(expr[i])) {
while (!is_empty(&op_stack) && priority(expr[i]) <= priority(top(&op_stack))) {
char op = pop(&op_stack);
double y = pop(&num_stack);
double x = pop(&num_stack);
double result = calculate(x, op, y);
push(&num_stack, result);
}
push(&op_stack, expr[i]);
} else if (expr[i] == '(') {
push(&op_stack, expr[i]);
} else if (expr[i] == ')') {
while (top(&op_stack) != '(') {
char op = pop(&op_stack);
double y = pop(&num_stack);
double x = pop(&num_stack);
double result = calculate(x, op, y);
push(&num_stack, result);
}
pop(&op_stack); // 弹出左括号
}
i++;
}
while (!is_empty(&op_stack)) {
char op = pop(&op_stack);
double y = pop(&num_stack);
double x = pop(&num_stack);
double result = calculate(x, op, y);
push(&num_stack, result);
}
double result = pop(&num_stack);
return result;
}
int main() {
char expr[MAX_SIZE];
printf("Please input an infix expression: ");
scanf("%s", expr);
double result = evaluate(expr);
printf("The result is: %g\n", result);
return 0;
}
```
阅读全文