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, Супермодераторы



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

Сейчас этот форум просматривают: YandexBot [bot]


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

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