Автор: Demm 8.06.2004 22:05
Хочу спросить знающих людей.
Вот отрывок из алгоритма :"Обратная польская запись просматривается слева направо."
Подразумевает ли это предложение использование стека однозначно?
Автор: GLuk 8.06.2004 23:01
Какой-то странный вопрос... понятие стека в данном случае имеет до *опы значений.
Как связан стек и полиз? Может имеешь в виду сопроцессорный стек?
Вообще-то вопрос довольно таки однозначен, но хотелось бы услышать более конкретную формулировку, либо весь контекст (навряд ли ты его сам придумал).
Автор: Demm 9.06.2004 0:23
Вот это алгоритм,который мне дала наша преподша:
Цитата
Вычисление значения выражения, представленного в обратной польской записи
Правило вычисления выражения в обратной польской записи состоит в следующем. Обратная польская запись просматривается слева направо. Если рассматриваемый элемент - операнд, то рассматривается следующий элемент. Если рассматриваемый элемент - знак операции, то выполняется эта операция над операндами, записанными левее знака операции. Результат операции записывается вместо первого (самого левого) операнда, участвовавшего в операции. Остальные элементы ( операнды и знак операции), участвовавшие в операции, вычеркиваются из записи.
Я его просмотрел, немного понял как работает польская запись.
В своей проге я реализовал список как двусвязный( при создании списка,и вычислении пол зап)!
А она засрала мне весь курсовик! Сказала, что везде должен быть стек!
Автор: Altair 9.06.2004 11:37
Цитата
Сказала, что везде должен быть стек!
Чушь по моему.
Вообще если работает правильно, то значит задача решена!
И вообще разница между стеком и списками только "идеологическая".
Автор: Demm 9.06.2004 19:20
Уж не знаю какая там идеодогическая разница,но удовлетворительно за это в зачетку она поставила!
Автор: Altair 9.06.2004 19:31
А идеологическая разница вот в чем:
в паскале все динамические структуры данных описываются одинаково. Разница только в способе добавления и извлечения элементов. А какой тип использовать в конкретной задаче не важно, если не указанно явно в задании. ИМХО ваша преподша просто решила запороть тебе курсовую или ты недоговариваешь условие.
Цитата
Подразумевает ли это предложение использование стека однозначно?
Однозначный ответ -
НЕТ!
Автор: Demm 9.06.2004 20:44
Вообще условие задачи
Цитата
Написать подпрограмму для вычисления значение выражения, представленного в обратной польской записи.
Вот все что написано в задании!
Автор: GLuk 9.06.2004 23:38
Я не зря задал первый вопрос: "Как связан стек и полиз".
Ты, вероятно, не там инфу копал...
Насчет полиза я уже говорил, надо было поиском пользоваться.
Цитата
Ты, вероятно имеешь в виду ПОЛИЗ (представление математических выражений с использованием обратной польской записи)?
Почитай про программирование сопроцессора, во-всяком я встретил это впервые именно там, хотя возможно есть оно и в уч. вышки.
Применимо к программированию FPU - рассмотрим на примере преобразования выражения: a+b*c-d/(a+B). Дерево нарисовать у меня наверное не получится, но в итоге она трансформируется в так называемую постфиксную запись: abc*+dab+/-.
Алгоритм вычисления имеет следующий вид:
1. Выбрать очередной символ.
2. Если это операнд поместить его в стек, затем (1).
3. Если это знак - выполнить ее над одним или 2я операндами, рез-ат поместить в вершину стека.
4. Если символы еще есть - (1).
Вкратце - такая вот ботва.
Покажи код.
Автор: Demm 10.06.2004 0:59
Я и не говорю,что стек с этим связан.
Вот у меня было задание
Цитата
Написать подпрограмму для вычисления значение выражения, представленного в обратной польской записи.
Я написал,а она меня послала куда подальше!
Код
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;
Я искал ,но что-то ничего не нашел на этом форуме!(я правда не искал как "полиз")