Как реализовать калькулятор со скобками на си(через обратную польскую запись)?

Для реализации калькулятора со скобками на языке программирования C можно использовать алгоритм обратной польской записи. Обратная польская запись (ОПЗ) представляет арифметическое выражение, в котором операнды расположены перед операторами, а скобки необходимы для задания порядка выполнения операций.

Шаги для реализации калькулятора со скобками на C:

1. Создайте стек для хранения операндов и операторов. В языке C можно использовать массив для этого.

2. Создайте функцию, которая будет проверять приоритет оператора. Для этого можно использовать простой if-else конструкций или оператор switch. Например, операторы умножения и деления имеют более высокий приоритет, чем операторы сложения и вычитания.

3. Создайте функцию, которая будет преобразовывать введенное пользователем арифметическое выражение в обратную польскую запись. Для этого можно использовать алгоритм с использованием стека:
- Переберите все символы введенного выражения.
- Если символ является операндом, добавьте его в выходную строку.
- Если символ является открывающей скобкой, поместите его в стек.
- Если символ является оператором, проверьте его приоритет. Если приоритет оператора из стека больше или равен приоритету текущего оператора, выведите оператор из стека и добавьте его в выходную строку. Повторяйте этот шаг, пока не будет выполнено условие или стек не станет пустым.
- Если символ является закрывающей скобкой, выведите все операторы из стека и добавьте их в выходную строку, пока не встретите открывающую скобку. Удалите открывающую скобку из стека.
- Повторяйте шаги 2-5 до тех пор, пока не пройдетесь по всем символам введенного выражения.
- Если стек не пуст после завершения цикла, выведите все операторы из стека и добавьте их в выходную строку.
- Выходная строка будет содержать обратную польскую запись арифметического выражения.

4. Создайте функцию, которая будет вычислять значение арифметического выражения, заданного в обратной польской записи. Для этого можно использовать стек:
- Переберите все символы входной строки.
- Если символ является операндом, поместите его в стек.
- Если символ является оператором, извлеките из стека два последних операнда, выполните операцию и поместите результат обратно в стек.
- Повторяйте этот шаг, пока не пройдетесь по всем символам входной строки.
- В результате в стеке останется одно значение, которое является результатом вычисления арифметического выражения.

5. Создайте функцию main, которая будет вводить арифметическое выражение с клавиатуры и вызывать функции преобразования выражения в ОПЗ и вычисления значения выражения. Например:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX_SIZE 100

int stack[MAX_SIZE];
int top = -1;

void push(int item) {
    if (top >= MAX_SIZE - 1) {
        printf("Stack Overflown");
        return;
    }
    stack[++top] = item;
}

int pop() {
    if (top < 0) {
        printf("Stack Underflown");
        return -1;
    }
    return stack[top--];
}

int is_operator(char symbol) {
    if (symbol == '+' || symbol == '-' ||
        symbol == '*' || symbol == '/')
        return 1;
    return 0;
}

int precedence(char symbol) {
    if (symbol == '*' || symbol == '/')
        return 2;
    else if (symbol == '+' || symbol == '-')
        return 1;
    else
        return 0;
}

void infix_to_postfix(char infix[], char postfix[]) {
    int i, j;
    char item;
    char x;

    push('(');
    strcat(infix, ")");
    i = 0;
    j = 0;
    item = infix[i];

    while (item != '') {
        if (item == '(')
            push(item);
        else if (isdigit(item) || isalpha(item))
            postfix[j++] = item;
        else if (is_operator(item)) {
            x = pop();
            while (is_operator(x) && precedence(x) >= precedence(item)) {
                postfix[j++] = x;
                x = pop();
            }
            push(x);
            push(item);
        } else if (item == ')') {
            x = pop();
            while (x != '(') {
                postfix[j++] = x;
                x = pop();
            }
        } else {
            printf("Invalid Arithmetic Expressionn");
            exit(0);
        }
        i++;
        item = infix[i];
    }
    postfix[j] = '';
}

int evaluate_postfix(char postfix[]) {
    int i, a, b, result;
    char ch;

    for (i = 0; postfix[i] != ''; i++) {
        ch = postfix[i];
        if (isdigit(ch))
            push(ch - '0');
        else if (is_operator(ch)) {
            b = pop();
            a = pop();

            switch (ch) {
                case '+':
                    push(a + b);
                    break;
                case '-':
                    push(a - b);
                    break;
                case '*':
                    push(a * b);
                    break;
                case '/':
                    push(a / b);
                    break;
            }
        }
    }
    result = pop();
    return result;
}

int main() {
    char infix[MAX_SIZE], postfix[MAX_SIZE];

    printf("Enter Infix Expression : ");
    gets(infix);

    infix_to_postfix(infix, postfix);
    printf("Postfix Expression: %sn", postfix);

    int result = evaluate_postfix(postfix);
    printf("Result: %dn", result);

    return 0;
}

Данный код демонстрирует основные шаги реализации калькулятора со скобками на языке C с использованием обратной польской записи. Пользователю предлагается ввести арифметическое выражение в инфиксной форме, а затем программа преобразует его в постфиксную форму и вычисляет результат. Например, если пользователь вводит выражение "((5 + 3) * 2)", программа выведет результат "16".