C语言编程这是一个四则运算表达式,由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包括+、-、*、/)以及括号((和))组成,每个运算数、运算符和括号都是一个token(标记)。现在,针对给定的一个四则运算表达式,需要给出其结果。
时间: 2023-06-25 13:08:13 浏览: 143
c语言算术表达式,加减乘除、乘方、括号。依次输出在求值过程中运算数栈内的栈顶数据变化过程,并最终输出表达式的值
5星 · 资源好评率100%
你可以采用栈来实现计算四则运算表达式的结果。具体步骤如下:
1. 将表达式中的所有token依次读入,遇到数字则直接入栈,遇到运算符则与栈顶元素进行运算。
2. 如果当前读入的运算符优先级高于栈顶运算符,则将当前运算符入栈;否则,弹出栈顶运算符,并将栈顶和次栈顶元素进行计算,把计算结果入栈。不停地执行这个过程,直到当前运算符可以入栈。
3. 如果当前读入的token是左括号,则直接入栈;如果是右括号,则弹出栈顶元素,直到遇到左括号为止,把这些元素一起作为一个新的数字入栈。
4. 最后,当所有token都读入后,若栈中仍有元素,则对这些元素进行计算,得到最终结果。
下面是一个简单的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
typedef struct {
int top;
double stack[MAX_STACK_SIZE];
} Stack;
void push(Stack *s, double num) {
if (s->top >= MAX_STACK_SIZE - 1) {
printf("Stack overflow!\n");
exit(EXIT_FAILURE);
}
s->stack[++s->top] = num;
}
double pop(Stack *s) {
if (s->top < 0) {
printf("Stack underflow!\n");
exit(EXIT_FAILURE);
}
return s->stack[s->top--];
}
double calculate(char *expr) {
Stack num_stack, op_stack;
num_stack.top = -1;
op_stack.top = -1;
char *p = expr;
while (*p != '\0') {
if (isdigit(*p) || *p == '-' && isdigit(*(p + 1))) {
double num = strtod(p, &p);
push(&num_stack, num);
} else if (*p == '+' || *p == '-') {
while (op_stack.top >= 0 && op_stack.stack[op_stack.top] != '(') {
double b = pop(&num_stack);
double a = pop(&num_stack);
char op = (char)pop(&op_stack);
if (op == '+')
push(&num_stack, a + b);
else
push(&num_stack, a - b);
}
push(&op_stack, *p);
p++;
} else if (*p == '*' || *p == '/') {
while (op_stack.top >= 0 && (op_stack.stack[op_stack.top] == '*' || op_stack.stack[op_stack.top] == '/')) {
double b = pop(&num_stack);
double a = pop(&num_stack);
char op = (char)pop(&op_stack);
if (op == '*')
push(&num_stack, a * b);
else
push(&num_stack, a / b);
}
push(&op_stack, *p);
p++;
} else if (*p == '(') {
push(&op_stack, *p);
p++;
} else if (*p == ')') {
while (op_stack.top >= 0 && op_stack.stack[op_stack.top] != '(') {
double b = pop(&num_stack);
double a = pop(&num_stack);
char op = (char)pop(&op_stack);
if (op == '+')
push(&num_stack, a + b);
else if (op == '-')
push(&num_stack, a - b);
else if (op == '*')
push(&num_stack, a * b);
else
push(&num_stack, a / b);
}
if (op_stack.top < 0 || op_stack.stack[op_stack.top] != '(') {
printf("Parentheses mismatched!\n");
exit(EXIT_FAILURE);
}
pop(&op_stack);
p++;
} else if (*p == ' ') {
p++;
} else {
printf("Invalid character: %c\n", *p);
exit(EXIT_FAILURE);
}
}
while (op_stack.top >= 0) {
double b = pop(&num_stack);
double a = pop(&num_stack);
char op = (char)pop(&op_stack);
if (op == '+')
push(&num_stack, a + b);
else if (op == '-')
push(&num_stack, a - b);
else if (op == '*')
push(&num_stack, a * b);
else
push(&num_stack, a / b);
}
if (num_stack.top != 0 || op_stack.top != -1) {
printf("Invalid expression!\n");
exit(EXIT_FAILURE);
}
return num_stack.stack[0];
}
int main() {
char expr[100];
printf("Enter an arithmetic expression: ");
fgets(expr, 100, stdin);
double result = calculate(expr);
printf("Result: %g\n", result);
return 0;
}
```
阅读全文