文件in.txt(测试数据) 共1行,是一个算式算式包含字符: “(”、“)”、“0-9”、“+”、“-”、“*”、“/”、“^”。(“/”用整数除法,算式长度<=50,其中所有数据在2^31-1的范围内)。写一段C语言包程序读取这个文件中的算式并算出结果
时间: 2023-11-05 20:07:05 浏览: 31
以下是一个简单的C语言程序,可以读取in.txt文件中的算式并计算结果:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#define MAX_LEN 50
// 定义一个栈结构体
typedef struct {
int top; // 栈顶指针
int data[MAX_LEN]; // 存储数据的数组
} Stack;
// 初始化栈
void initStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack* s) {
return s->top == MAX_LEN-1;
}
// 入栈
void push(Stack* s, int x) {
if (isFull(s)) {
printf("Stack overflow\n");
exit(1);
}
s->data[++s->top] = x;
}
// 出栈
int pop(Stack* s) {
if (isEmpty(s)) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top--];
}
// 获取栈顶元素
int peek(Stack* s) {
if (isEmpty(s)) {
printf("Stack is empty\n");
exit(1);
}
return s->data[s->top];
}
// 判断字符是否为操作符
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}
// 判断操作符的优先级
int precedence(char op) {
switch (op) {
case '+': case '-': return 1;
case '*': case '/': return 2;
case '^': return 3;
default: return -1;
}
}
// 计算二元表达式
int evaluate(int x, int y, char op) {
switch (op) {
case '+': return x + y;
case '-': return x - y;
case '*': return x * y;
case '/': return x / y;
case '^': return (int)pow(x, y);
default: return 0;
}
}
int main() {
Stack opStack; // 操作符栈
Stack valStack; // 值栈
char expr[MAX_LEN+1]; // 存储读入的算式
int i, n, x, y, result;
// 初始化栈
initStack(&opStack);
initStack(&valStack);
// 读入算式
fgets(expr, MAX_LEN+1, stdin);
n = strlen(expr);
if (expr[n-1] == '\n') {
expr[n-1] = '\0';
n--;
}
// 对算式进行解析和计算
for (i = 0; i < n; i++) {
if (isdigit(expr[i])) { // 如果是数字,入栈
x = 0;
while (i < n && isdigit(expr[i])) {
x = x * 10 + (expr[i] - '0');
i++;
}
push(&valStack, x);
i--; // 注意要回退一步
} else if (expr[i] == '(') { // 如果是左括号,入栈
push(&opStack, expr[i]);
} else if (expr[i] == ')') { // 如果是右括号,计算并出栈
while (!isEmpty(&opStack) && peek(&opStack) != '(') {
y = pop(&valStack);
x = pop(&valStack);
result = evaluate(x, y, pop(&opStack));
push(&valStack, result);
}
if (!isEmpty(&opStack) && peek(&opStack) == '(') {
pop(&opStack);
}
} else if (isOperator(expr[i])) { // 如果是操作符,进行运算
while (!isEmpty(&opStack) && precedence(expr[i]) <= precedence(peek(&opStack))) {
y = pop(&valStack);
x = pop(&valStack);
result = evaluate(x, y, pop(&opStack));
push(&valStack, result);
}
push(&opStack, expr[i]);
} else { // 如果是非法字符,提示错误
printf("Invalid character: %c\n", expr[i]);
exit(1);
}
}
// 计算剩余的表达式
while (!isEmpty(&opStack)) {
y = pop(&valStack);
x = pop(&valStack);
result = evaluate(x, y, pop(&opStack));
push(&valStack, result);
}
// 输出结果
printf("%d\n", pop(&valStack));
return 0;
}
```
该程序使用两个栈来实现算式的计算,一个栈用于存储操作符,另一个栈用于存储值。具体实现过程如下:
1. 初始化两个栈。
2. 读入算式并依次处理每个字符。
3. 如果是数字,则将其转化为整数并入值栈。
4. 如果是左括号,则入操作符栈。
5. 如果是右括号,则将操作符栈中的操作符和值栈中的值进行计算,直到遇到左括号为止。
6. 如果是操作符,则将其入操作符栈,并将操作符栈中优先级高于等于该操作符的操作符和值栈中的值进行计算。
7. 如果是非法字符,则提示错误并退出程序。
8. 最后计算操作符栈中剩余的表达式,得到最终结果。
注意,由于除法运算使用的是整数除法,因此需要特别处理。此外,为了方便起见,本程序假设输入的算式都是合法的,并没有进行完整的错误处理。