Files
C_code/exercise/1.c
T

177 lines
3.5 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#ifdef _WIN32
#include <windows.h>
#include <direct.h>
#endif
#define MAX_SIZE 1000
// 栈结构用于存储数字
typedef struct
{
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s)
{
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s)
{
return s->top == -1;
}
// 入栈
void push(Stack *s, int value)
{
if (s->top < MAX_SIZE - 1)
{
s->data[++s->top] = value;
}
}
// 出栈
int pop(Stack *s)
{
if (!isEmpty(s))
{
return s->data[s->top--];
}
return 0;
}
// 获取栈顶元素
int peek(Stack *s)
{
if (!isEmpty(s))
{
return s->data[s->top];
}
return 0;
}
// 判断运算符优先级
int precedence(char op)
{
if (op == '+' || op == '-')
return 1;
if (op == '*' || op == '/')
return 2;
return 0;
}
// 执行运算
int calculate(int a, int b, char op)
{
switch (op)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
}
// 计算表达式
int evaluateExpression(char *expression)
{
Stack numbers;
Stack operators;
initStack(&numbers);
initStack(&operators);
int len = strlen(expression);
for (int i = 0; i < len; i++)
{
// 跳过空格
if (expression[i] == ' ')
{
continue;
}
// 如果是数字
if (isdigit(expression[i]))
{
int num = 0;
// 读取完整的数字
while (i < len && isdigit(expression[i]))
{
num = num * 10 + (expression[i] - '0');
i++;
}
i--; // 回退一位,因为for循环会自动增加
push(&numbers, num);
}
// 如果是运算符
else if (expression[i] == '+' || expression[i] == '-' ||
expression[i] == '*' || expression[i] == '/')
{
// 处理运算符优先级
while (!isEmpty(&operators) &&
precedence((char)peek(&operators)) >= precedence(expression[i]))
{
int b = pop(&numbers);
int a = pop(&numbers);
char op = (char)pop(&operators);
push(&numbers, calculate(a, b, op));
}
push(&operators, expression[i]);
}
}
// 处理剩余的运算符
while (!isEmpty(&operators))
{
int b = pop(&numbers);
int a = pop(&numbers);
char op = (char)pop(&operators);
push(&numbers, calculate(a, b, op));
}
return pop(&numbers);
}
int main()
{
// 设置控制台编码为UTF-8,防止中文乱码
#ifdef _WIN32
system("chcp 65001 > nul"); // 设置控制台编码为UTF-8
SetConsoleOutputCP(65001); // 设置控制台输出编码
SetConsoleCP(65001); // 设置控制台输入编码
_mkdir("records");
#endif
char expression[MAX_SIZE];
// 读取表达式
if (fgets(expression, sizeof(expression), stdin) != NULL)
{
// 去除换行符
int len = strlen(expression);
if (len > 0 && expression[len - 1] == '\n')
{
expression[len - 1] = '\0';
}
// 计算并输出结果
int result = evaluateExpression(expression);
printf("%d\n", result);
}
return 0;
}