Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2021, 17:55   #1
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию Преобразование в обратную польскую запись с++

Код:
#include <iostream>
using namespace std;
struct stack {
    char data;
    stack* next;
};
void push(stack*& Top, char newElem);
char pop(stack*& Top);
inline bool empty(stack*& l1)
{
    return (l1 == nullptr);
}
inline bool isNumber(char x)
{
    return isdigit(x);
}
inline bool isOpenBracket(char x)
{
    return x == '(' || x == '{' || x == '[';
}
 
inline bool isClosingBracket(char x)
{
    return x == ')' || x == '}' || x == ']';
}
bool isOperation(char x);
int prior(char x);
int main()
{
    system("chcp 1251>nul");
    stack* poland;
    char expression[100];
    char  source_line[100];
    char k;
    int i = 0,j=0;
    cout << "Input expression:";
    cin.getline(expression, 100);
    while (expression[i] != '\0') {
        if (isNumber(expression[i])) {
            source_line[j] = expression[i];
            j++;
        }
        if (isOpenBracket(expression[i])) {
            push(poland, expression[i]);
        }
        if (isClosingBracket(expression[i])) {
            k=pop(poland);
            while (!isOpenBracket(k))
            {
                source_line[j] = k;
                k = pop(poland);
                j++;
            }
        }
        if (isOperation(expression[i]) && (source_line[i] != '('))
        {
            source_line[j] = ' ';
            j++;
            int x;
            x=k = pop(poland);
            if (x == 1)
            {
                while (prior(expression[i]))
                {
                    expression[j] = k;
                    j++;
                    x = k = pop(poland);
                    if (x == 0)
                        break;
                }
            }
            if (x != 0)
                push(poland,k);
            push(poland,expression[i]);
        }
        i++;
    }
    while (source_line[j] == pop(poland))
        j++;
    cout << source_line;
    system("pause>nul");
    return 0;
}
int prior(char x)
{
    switch (x)
    {
    case '*':
    case '/':
        return 3;
 
    case '-':
    case '+':
        return 2;
 
    case '(':
        return 1;
    }
}
void push(stack*& Top, char newElem) {
    stack* q = new stack;
    q->data = newElem;
    q->next = Top;
    Top = q;
}
char pop(stack*& Top) {
    char val;
    if (Top == NULL) {
        cout << "Stek is empty";
        return 0;
    }
    else {
        stack* p = Top;
        val = Top->data;
        Top = Top->next;
        delete p;
    }
    return val;
}
bool isOperation(char x) {
    switch (x) {
    case '+':
    case '-':
    case '*':
    case '/':
    case '=':
        return true;
    default:
        return false;
    }
}
Здравствуйте, я здесь пробовал реализовать преобразования в польский инверсионный запись, и что-то не получилось в чем ошибка и как исправить? Буду благодарен за ответ
sobaka13 вне форума Ответить с цитированием
Старый 18.05.2021, 20:44   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Не надо на себя наговаривать:
Цитата:
пробовал реализовать
имеется в виду "нашёл что-то похожее в сети" ? Потому что написавший знает конкретно что "не получилось" и в чём это проявляется. Пример входной строки и результат преобразования ?
Насколько помнит мой склероз курс АЯиЧМ - прежде чем реализовывать, надо расписать грамматику создаваемого языка: набор символов, набор правил и т.п. Если короче - какие будут операнды: константы, переменные, целые, вещественные и т.д. Проверка синтаксиса - нужна или предполагается, что входная строка корректна. А уж потом преобразовывать.
https://ru.wikipedia.org/wiki/Обратная_польская_запись

Последний раз редактировалось digitalis; 18.05.2021 в 20:49.
digitalis вне форума Ответить с цитированием
Старый 18.05.2021, 21:13   #3
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

digitalis, ну во первих,я сам писал,а не знаю какая ошибка,просто на екран ничего не виводит в строку
sobaka13 вне форума Ответить с цитированием
Старый 18.05.2021, 21:41   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Оно не ничего не выводит, а падает. Во-первых, сделать "stack* poland = nullptr;", а то указатель не инициализирован, во-вторых, заменить NULL на nullptr, раз уж на плюсах пишем. После этого получаем что-то чуть более осмысленное:
Цитата:
Input expression:1
Stek is emptyStek is emptyStek is emptyStek is emptyStek is emptyStek is emptyStek is emptyStek is empty1
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 18.05.2021, 21:44   #5
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

BDA, Да чет мусор какойто
sobaka13 вне форума Ответить с цитированием
Старый 18.05.2021, 23:02   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Просто несколько раз дернули pop при пустом стеке. Но код еще отлаживать и отлаживать. Замечания при беглом просмотре: source_line должен быть большей длины, раз добавляются пробелы; не должно быть присвоений в expression; не должно быть сравнений с source_line; нет проверки на парность скобок (открывающая скобка одного вида, а закрывающая - другого); бесконечный цикл при несогласованности скобок (нет открывающей скобки для найденной закрывающей).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 18.05.2021, 23:16   #7
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

BDA,
Код:
bool isEqual(char a, char b) {
    return a == '(' && b == ')'
        || a == '[' && b == ']'
        || a == '{' && b == '}';
}
добавил функцию,но хз что уже здесь поменять:
Код:
 if (isOperation(expression[i]) && (source_line[i] != '('))
        {
            source_line[j] = ' ';
            j++;
            int x;
            x=k = pop(poland);
            if (x == 1)
            {
                while (prior(expression[i]))
                {
                    expression[j] = k;
                    j++;
                    x = k = pop(poland);
                    if (x == 0)
                        break;
                }
            }
            if (x != 0)
                push(poland,k);
            push(poland,expression[i]);
        }
        i++;
    }
    while (source_line[j] == pop(poland))
        j++;
    cout<<source_line;
sobaka13 вне форума Ответить с цитированием
Старый 19.05.2021, 00:53   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Это нужно править в другом if.
Код:
bool pop(stack*& Top, char& val)
{
    if (Top == nullptr)
        return false;
    stack* p = Top;
    val = Top->data;
    Top = Top->next;
    delete p;
    return true;
}

bool isPairBracket(char a, char b)
{
    return a == '(' && b == ')' || a == '[' && b == ']' || a == '{' && b == '}';
}
...
        if (isClosingBracket(expression[i]))
        {
            if (!pop(poland, k))
            {
                cout << "Stack is empty";
                exit(EXIT_FAILURE);
            }
            while (!isOpenBracket(k))
            {
                source_line[j] = k;
                j++;
                if (!pop(poland, k))
                {
                    cout << "Stack is empty";
                    exit(EXIT_FAILURE);
                }
            }
            if (!isPairBracket(k, expression[i]))
            {
                cout << "No pair bracket";
                exit(EXIT_FAILURE);
            }
        }
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.05.2021, 01:00   #9
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

BDA,
Код:
int main()
{
    system("chcp 1251>nul");
    stack* poland=nullptr;
    char expression[100];
    char  source_line[100];
    char k;
    int i = 0,j=0;
    cout << "Input expression:";
    cin.getline(expression, 100);
    while (expression[i] != '\0') {
        if (isNumber(expression[i])) {
            source_line[j] = expression[i];
            j++;
        }
        if (isClosingBracket(expression[i]))
        {
            if (!pop(poland, k))
            {
                cout << "Stack is empty";
                exit(EXIT_FAILURE);
            }
            while (!isOpenBracket(k))
            {
                source_line[j] = k;
                j++;
                if (!pop(poland, k))
                {
                    cout << "Stack is empty";
                    exit(EXIT_FAILURE);
                }
            }
            if (!isPairBracket(k, expression[i]))
            {
                cout << "No pair bracket";
                exit(EXIT_FAILURE);
            }
        }
        if (isOperation(expression[i]) && (source_line[i] != '('))
        {
            source_line[j] = ' ';
            j++;
            int x;
            x=k = pop(poland);
            if (x == 1)
            {
                while (prior(expression[i]))
                {
                    expression[j] = k;
                    j++;
                    x = k = pop(poland);
                    if (x == 0)
                        break;
                }
            }
            if (x != 0)
                push(poland,k);
            push(poland,expression[i]);
        }
        i++;
    }
    while (source_line[j] == pop(poland))
        j++;
    cout<<source_line;
    system("pause>nul");
    return 0;
}
Почемуто не работает
sobaka13 вне форума Ответить с цитированием
Старый 19.05.2021, 01:04   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Потому что все тело ифа "if (isOperation(expression[i]) && (source_line[i] != '('))" и while в конце тоже требуют исправлений. Например, while:
Код:
    while (pop(poland, k))
    {
        if (!isOperation(k))
        {
            cout << "Brackets are not matched";
            exit(EXIT_FAILURE);
        }
        source_line[j] = k;
        j++;
    }
    source_line[j] = '\0';
Остается исправить последний if.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.05.2021 в 01:13.
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа которая вычисляет польскую инверсную запись на С++ или Паскаль Casillas1 Помощь студентам 5 05.11.2014 16:07
Превод из инфиксной в обратную польскую запись Anny_Apple Помощь студентам 0 11.04.2011 19:22
Перевод из инфиксной записи в обратную польскую Anny_Apple Паскаль, Turbo Pascal, PascalABC.NET 1 10.04.2011 20:49
Задача на обратную польскую запись Horknee Помощь студентам 8 11.03.2009 22:09
Pascal Перевод в Польскую запись ЮнПрог Помощь студентам 3 29.12.2008 13:51