2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Обратная польская нотация
Сообщение18.06.2019, 21:57 


28/07/17

317
arseniiv в сообщении #1400024 писал(а):
Правильно — это именно 7625597484987? И $3-3-3$ даёт $-3$, и всё без учёта ассоциирования? Странно.

Он у меня пока не считает конечный результат. Только в ОПН переводит:

Код:
                if(s_rez =="^") b = (y < x);
                else            b = (y >= x);

                if(b)
                {

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение18.06.2019, 22:03 
Заслуженный участник


27/04/09
28128
Кстати плохо, что "^" вставлено прям в код парсера. Это часть данных, которые должно быть легко менять и добавлять.

-- Ср июн 19, 2019 00:04:01 --

С другой стороны, кому я говорю, за столько-то лет пользы это вроде не принесло. :| :D

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение18.06.2019, 22:25 
Заслуженный участник


26/05/14
981
FomaNeverov в сообщении #1400025 писал(а):
Код:
                if(s_rez =="^") b = (y < x);
                else            b = (y >= x);

                if(b)
                {

Мне не нравится как считается переменная b. Но не видя полный код, я не могу быть уверен. Попробуйте 3 - 3 ^ 3.

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 06:50 


28/07/17

317
Переменная b булева типа, считается правильно. Сам код считал 3 - 3 ^ 3 неправильно. Нужно было "если переменная, прочитанная из строки и переменная, взятая из стека"

Код:
                if((s_rez == "^") && (s2 == "^")) b = (y < x);
                else            b = (y >= x);


Спасибо за подсказку.

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 08:56 
Заслуженный участник


26/05/14
981
x, y - это приоритеты операций из строки и из стека?

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 12:19 


28/07/17

317
Да. s_rez это символ из строки, x - его приоритет, s2 - символ из стека, у - приоритет. Приоритет числа - 0, скобок - 1, +- - 2, */ - 3, ^ - 4.

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 15:29 
Заслуженный участник


27/04/09
28128
А неправильные последовательности скобок у вас тоже отсекаются за тот же самый проход по входной строке? А то может уже правда переписать в виде классической сортировочной станции и знать, что ничего патчить не придётся?

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 16:43 
Заслуженный участник


26/05/14
981
FomaNeverov в сообщении #1400090 писал(а):
Да. s_rez это символ из строки, x - его приоритет, s2 - символ из стека, у - приоритет. Приоритет числа - 0, скобок - 1, +- - 2, */ - 3, ^ - 4.

Тогда "b = (y < x)" равнозначно "b = false".

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 19:31 


28/07/17

317
slavav в сообщении #1400139 писал(а):
FomaNeverov в сообщении #1400090 писал(а):
Да. s_rez это символ из строки, x - его приоритет, s2 - символ из стека, у - приоритет. Приоритет числа - 0, скобок - 1, +- - 2, */ - 3, ^ - 4.

Тогда "b = (y < x)" равнозначно "b = false".

Но почему? На момент вычисления оператора в х и у находятся некоторые значения. Если у меньше х, то выражение в скобках будет истино, и соответственно переменной b присвоится true.
1. Из чего следует ваше утверждение?
2. Эта конструкция в коде работает, именно так, как предполагалось, возведение в степень обрабатывается иначе, чем +-*/

-- 19.06.2019, 19:39 --

arseniiv в сообщении #1400122 писал(а):
А неправильные последовательности скобок у вас тоже отсекаются за тот же самый проход по входной строке? А то может уже правда переписать в виде классической сортировочной станции и знать, что ничего патчить не придётся?

Ошибки во входной строке пока не обрабатываются никак. Это мой метод написания программ: разбить задачу на этапы. Сперва я добьюсь, что-бы правильные выражения вычислялись правильно, потом (может быть, при необходимости) допилю обработку ошибок.

Что за классическая сортировочная станция? Я почитал в википедии, но, честно говоря, мало что понял. Алгоритм вычисления обратной польской нотации я взял отсюда: https://habr.com/ru/post/282379/

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 20:08 
Заслуженный участник


26/05/14
981
FomaNeverov в сообщении #1400183 писал(а):
slavav в сообщении #1400139 писал(а):
FomaNeverov в сообщении #1400090 писал(а):
Да. s_rez это символ из строки, x - его приоритет, s2 - символ из стека, у - приоритет. Приоритет числа - 0, скобок - 1, +- - 2, */ - 3, ^ - 4.

Тогда "b = (y < x)" равнозначно "b = false".

Но почему? На момент вычисления оператора в х и у находятся некоторые значения. Если у меньше х, то выражение в скобках будет истино, и соответственно переменной b присвоится true.
1. Из чего следует ваше утверждение?

"if((s_rez == "^") && (s2 == "^")) b = (y < x); else ...". Здесь s_rez равен s2, значит y равен x.
Я могу ошибаться, так как не вижу весь код.

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 20:36 
Заслуженный участник


27/04/09
28128
FomaNeverov в сообщении #1400183 писал(а):
Что за классическая сортировочная станция?
https://en.wikipedia.org/wiki/Shunting-yard_algorithm Дейкстры, который поминался ещё Pphantom во втором посте темы. :-)

Можно найти варианты с немного разным функционалом, но как правило они все одинаково проверены.

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 20:56 


28/07/17

317
slavav в сообщении #1400191 писал(а):
"if((s_rez == "^") && (s2 == "^")) b = (y < x); else ...". Здесь s_rez равен s2, значит y равен x.
Я могу ошибаться, так как не вижу весь код.

Вы правы, b всегда будет false и код if(b) в данном случае никогда не выполнится. Так что код упростился, правда не стал понятнее. Вот эта часть кода (закомментировано, как было раньше):

Код:
            // открывающую кнопку сразу в стек
            if(s_rez == "(") goto met_30;
           
            else
            {
met_10:
                // если стек пуст, любой знак сразу в стек
                if(sstack.isEmpty()) goto met_30;

                // последний элемент из стека
                s = sstack.takeLast();

                // приоритет последнего символа в стеке
                y = test_symbol(s);

                // если приоритет последнего символа в стеке выше нового
                // из стека в массив, новый в стек, в цикле (met_10)
                //if(s_rez =="^" && s == "^") b = (y < x);
                //else                        b = (y >= x);
                //if(b)

                if((x == 4) && (y == 4)) goto met_20;

                // если приоритет последнего символа в стеке выше нового
                // из стека в массив, новый в стек, в цикле (met_10)
                if(y >= x)
                {
                    massiv << s;
                    goto met_10;
                }

met_20:
                sstack << s;

met_30:
                sstack << s_rez;
            }

 Профиль  
                  
 
 Re: Обратная польская нотация
Сообщение19.06.2019, 21:31 
Заслуженный участник


26/05/14
981
Вы можете завести ещё одну переменную для правоассоциативности и сделать так:
Код:
bool ra = right_associative(s_rez);
int p = priority(s_rez);
while (ra ? priority(stack.top()) > p : priority(stack.top()) >= p)
{
    output.push_back(stack.top());
    stack.pop();
}
stack.push(s_rez);

Я не использовал вашу нотацию. Так мне проще изложить своё видение решения.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group