#define MAX_STACK_SIZE 20
long valuesStack[MAX_STACK_SIZE];
char operatorsStack[MAX_STACK_SIZE];
int valuesTop = -1;
int operatorsTop = -1;
void pushValue(long value) {
if (valuesTop < MAX_STACK_SIZE - 1) {
valuesStack[++valuesTop] = value;
}
}
long popValue() {
if (valuesTop >= 0) {
return valuesStack[valuesTop--];
}
return 0;
}
void pushOperator(char op) {
if (operatorsTop < MAX_STACK_SIZE - 1) {
operatorsStack[++operatorsTop] = op;
}
}
char popOperator() {
if (operatorsTop >= 0) {
return operatorsStack[operatorsTop--];
}
return 0;
}
char peekOperator() {
if (operatorsTop >= 0) {
return operatorsStack[operatorsTop];
}
return 0;
}
bool isOperatorsEmpty() {
return operatorsTop == -1;
}
long calculate(long a, long b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return (b != 0) ? (a / b) : 0;
default: return 0;
}
}
int getPriority(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
void processOperator(char op) {
while (!isOperatorsEmpty() && getPriority(peekOperator()) >= getPriority(op)) {
char oper = popOperator();
long b = popValue();
long a = popValue();
pushValue(calculate(a, b, oper));
}
pushOperator(op);
}
long evaluateExpression(String expression) {
for (int i = 0; i < expression.length(); i++) {
char c = expression[i];
if (isdigit(c)) {
long num = 0;
while (i < expression.length() && isdigit(expression[i])) {
num = num * 10 + (expression[i] - '0');
i++;
}
i--;
pushValue(num);
}
else if (c == '(') {
pushOperator(c);
}
else if (c == ')') {
while (!isOperatorsEmpty() && peekOperator() != '(') {
char oper = popOperator();
long b = popValue();
long a = popValue();
pushValue(calculate(a, b, oper));
}
popOperator();
}
else if (c == '+' || c == '-' || c == '*' || c == '/') {
processOperator(c);
}
}
while (!isOperatorsEmpty()) {
char oper = popOperator();
long b = popValue();
long a = popValue();
pushValue(calculate(a, b, oper));
}
if (valuesTop >= 0) {
return popValue();
}
return 0;
}
void setup() {
Serial.begin(9600);
Serial.println("Введите арифметическое выражение:");
}
void loop() {
if (Serial.available() > 0) {
String expression = Serial.readStringUntil('\n');
long result = evaluateExpression(expression);
Serial.print("Результат: ");
Serial.println(result);
}
}