Хочу спросить знающих людей.
Вот отрывок из алгоритма :"Обратная польская запись просматривается слева направо."
Подразумевает ли это предложение использование стека однозначно?
![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() ![]() |
![]() |
Demm |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Хочу спросить знающих людей.
Вот отрывок из алгоритма :"Обратная польская запись просматривается слева направо." Подразумевает ли это предложение использование стека однозначно? |
GLuk |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
Какой-то странный вопрос... понятие стека в данном случае имеет до *опы значений.
Как связан стек и полиз? Может имеешь в виду сопроцессорный стек? Вообще-то вопрос довольно таки однозначен, но хотелось бы услышать более конкретную формулировку, либо весь контекст (навряд ли ты его сам придумал). |
Demm |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот это алгоритм,который мне дала наша преподша:
Цитата Вычисление значения выражения, представленного в обратной польской записи Правило вычисления выражения в обратной польской записи состоит в следующем. Обратная польская запись просматривается слева направо. Если рассматриваемый элемент - операнд, то рассматривается следующий элемент. Если рассматриваемый элемент - знак операции, то выполняется эта операция над операндами, записанными левее знака операции. Результат операции записывается вместо первого (самого левого) операнда, участвовавшего в операции. Остальные элементы ( операнды и знак операции), участвовавшие в операции, вычеркиваются из записи. Я его просмотрел, немного понял как работает польская запись. В своей проге я реализовал список как двусвязный( при создании списка,и вычислении пол зап)! А она засрала мне весь курсовик! Сказала, что везде должен быть стек! |
Altair |
![]()
Сообщение
#4
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата Сказала, что везде должен быть стек! Чушь по моему. Вообще если работает правильно, то значит задача решена! И вообще разница между стеком и списками только "идеологическая". -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Demm |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Уж не знаю какая там идеодогическая разница,но удовлетворительно за это в зачетку она поставила!
|
Altair |
![]()
Сообщение
#6
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
А идеологическая разница вот в чем:
в паскале все динамические структуры данных описываются одинаково. Разница только в способе добавления и извлечения элементов. А какой тип использовать в конкретной задаче не важно, если не указанно явно в задании. ИМХО ваша преподша просто решила запороть тебе курсовую или ты недоговариваешь условие. Цитата Подразумевает ли это предложение использование стека однозначно? Однозначный ответ - НЕТ! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Demm |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вообще условие задачи
Цитата Написать подпрограмму для вычисления значение выражения, представленного в обратной польской записи. Вот все что написано в задании! |
GLuk |
![]()
Сообщение
#8
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я не зря задал первый вопрос: "Как связан стек и полиз".
Ты, вероятно, не там инфу копал... Насчет полиза я уже говорил, надо было поиском пользоваться. Цитата Ты, вероятно имеешь в виду ПОЛИЗ (представление математических выражений с использованием обратной польской записи)? Почитай про программирование сопроцессора, во-всяком я встретил это впервые именно там, хотя возможно есть оно и в уч. вышки. Применимо к программированию FPU - рассмотрим на примере преобразования выражения: a+b*c-d/(a+B). Дерево нарисовать у меня наверное не получится, но в итоге она трансформируется в так называемую постфиксную запись: abc*+dab+/-. Алгоритм вычисления имеет следующий вид: 1. Выбрать очередной символ. 2. Если это операнд поместить его в стек, затем (1). 3. Если это знак - выполнить ее над одним или 2я операндами, рез-ат поместить в вершину стека. 4. Если символы еще есть - (1). Вкратце - такая вот ботва. Покажи код. |
Demm |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я и не говорю,что стек с этим связан.
Вот у меня было задание Цитата Написать подпрограмму для вычисления значение выражения, представленного в обратной польской записи. Я написал,а она меня послала куда подальше! Код function count_result (op1,op2:real;o:string):real; var c:char; r:real; begin if length(o)<>1 then t:=false; c:=o[1]; t:=true; case c of '+':r:=op2+op1; '-':r:=op2-op1; '/':r:=op2/op1; '*':r:=op2*op1; else t:=false; end; count_result:=r; end; procedure calc; var tek,oper1,oper2:pitem;{адрес текущей записи и ее операндов} op1,op2:real;{операнды в числовом выражении} op:set of char; n:integer; r:real;{результат операции} c:char; begin tek:=first; op:=['+','-','/','*']; while (tek<>nil) do begin c:=tek^.info[1]; if (c in op) then begin oper1:=tek^.pred; oper2:=oper1^.pred; if (oper1=nil)or(oper2=nil) then t:=false; val(oper1^.info,op1,n); if n<>0 then t:=false; val(oper2^.info,op2,n); if n<>0 then t:=false; r:=count_result(op1,op2,tek^.info); if t<>false then begin str(r:8:2,oper2^.info); oper2^.next:=tek^.next; dispose(oper1); if oper1<>nil then oper1^.pred:=oper2; dispose(tek); tek:=oper1; end; end else tek:=tek^.next; end; if (first^.next<>nil) or (first^.pred<>nil) then begin writeln('выражение ошибочно'); end; end; Я искал ,но что-то ничего не нашел на этом форуме!(я правда не искал как "полиз") Сообщение отредактировано: Demm - |
![]() ![]() |
![]() |
Текстовая версия | 2.10.2023 8:51 |