c语言,数学课上,数学老师在黑板上写了一个式子,小明想要快速得出这个式子的答案,你能帮他吗?给出一个只包含+,-,=,0~9的式子,求该式子的值。题目保证给出的式子合法,式子中的每一个数都是非负整数,且式子以=结尾。
时间: 2023-06-14 20:07:46 浏览: 149
可以使用栈来解决这个问题,具体步骤如下:
1. 定义一个栈,用来存储数字和运算符;
2. 从左到右遍历式子中的每一个字符,如果当前字符是数字,则将其转换成整数并压入栈中;
3. 如果当前字符是运算符,则弹出栈顶的两个数字进行运算,并将结果压入栈中;
4. 当遇到等号时,栈中只剩下一个数字,即为式子的结果。
下面是用C语言实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define STACK_SIZE 100
typedef struct {
int data[STACK_SIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
void push(Stack *s, int value) {
if (s->top == STACK_SIZE - 1) {
fprintf(stderr, "Stack overflow!\n");
exit(EXIT_FAILURE);
}
s->top++;
s->data[s->top] = value;
}
int pop(Stack *s) {
if (s->top == -1) {
fprintf(stderr, "Stack underflow!\n");
exit(EXIT_FAILURE);
}
int value = s->data[s->top];
s->top--;
return value;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
int calculate(char *expr) {
Stack s;
initStack(&s);
int len = strlen(expr);
int i = 0;
while (i < len) {
if (isdigit(expr[i])) {
int num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
push(&s, num);
} else {
int op1 = pop(&s);
int op2 = pop(&s);
switch (expr[i]) {
case '+': push(&s, op2 + op1); break;
case '-': push(&s, op2 - op1); break;
case '=': return pop(&s);
default: fprintf(stderr, "Invalid input!\n"); exit(EXIT_FAILURE);
}
i++;
}
}
return 0;
}
int main() {
char expr[100];
printf("Please enter an expression: ");
fgets(expr, sizeof(expr), stdin);
expr[strlen(expr) - 1] = '\0'; // 去掉换行符
int result = calculate(expr);
printf("The result is %d.\n", result);
return 0;
}
```
其中,`Stack`是栈的数据结构,`initStack`、`push`、`pop`和`isEmpty`分别用于初始化栈、入栈、出栈和判断栈是否为空。`calculate`函数用于计算式子的值,它依次遍历式子中的每个字符,并根据字符的类型进行相应的操作。最后返回栈中仅剩的一个数字,即为式子的结果。在`main`函数中,我们读入用户输入的式子,并输出计算结果。