Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на Обратную Польскую Нотацию (постфикс)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
PanTILImon
Программеры, решите пожалуйста задачку.

Дана string и в ней записано мат. выражение в постфиксной форме. Нужно подсчитать резутьтат. (используются знаки +, -, /, * (, ), и только целые числа)

Заранее СПАСИБА...
volvo
PanTILImon, я не понял, поиском воспользоваться тебе религия не позволяет?
FAQ: Постфиксная форма записи
Guest
Volvo, я ваще нуб в паскале. Мне в универе задачу дали, а зафтра сдавать нада уже, а то зачОт не паставят.

Я по той ссылке, которую ты мне дал ваще ничего не панимаю.
И мне переводить из объчной формы нинада, т.к. в строке дана сразу постфиксная.

И можно без стека или нет???

Помоги пожалуйста решить...
Atos
Цитата
Мне в универе задачу дали, а зафтра сдавать нада уже,
Что-то сомнительно. Такие задачи на один день не даются. Что же ты полсеместра делал?
volvo
Цитата
И можно без стека или нет???

Без стека - однозначно нельзя... На использовании стека и основан алгоритм... Если не надо переводить в постфикс, то придется чуть-чуть поменять программу... Сейчас посмотрю, что именно там нужно сделать...
volvo
Стоп, стоп... Я только сейчас сообразил... Ты это о чем?
Цитата
(используются знаки +, -, /, * (, ), и только целые числа)

? blink.gif Скобки в постфиксе? Тогда зачем мне такой постфикс нужен, спрашивается, если придется еще раз учитывать приоритет вычислений? НЕ БЫВАЕТ скобок в постфиксной записи !!!

Уточни задание...
panTILImon
volvo, я блин описался/
Нет канечна скобок никаких.
ТОКА: *, /, +, -, целые числа.
panTILImon
volvo, реши плиз, Ты же мозг!!! А то мне зафтра сдавать нада...(((
volvo
Ну что, неужели не можешь сам догадаться, что надо изменить?
Вот так:
type
TokenType =
(tkOpen,
tkPlus, tkMinus,
tkMult, tkDiv,
tkClose,
tkNumber );


type
{ Хоть тебе и нужны только целые, но при делении будет вещественное }
TType = Real;

PTItem = ^TItem;
TStack = PTItem;
TItem =
record
info: TType;
next: PTItem;
end;

procedure initStack(var s: TStack);
begin
s := nil
end;

function isEmpty(var s: TStack): boolean;
begin
isEmpty := (s = nil)
end;

procedure pushStack(var s: TStack; T: TType);
var
nItem: PTItem;
begin
new(nItem);
nItem^.next := s;
nItem^.info := T;
s := nItem;
end;

function topStack(var s: TStack): TType;
begin
topStack := s^.info
end;

function popStack(var s: TStack): TType;
var ToDelete: PTItem;
begin
if not isEmpty(s) then
begin
ToDelete := s;
s := s^.next;
popStack := ToDelete^.info;
dispose(ToDelete)
end;
end;


function getNextToken(var s, sT: string): TokenType;
begin
While s[1] = ' ' Do Delete(s, 1, 1);
case s[1] of
'(', ')':
begin
case s[1] of
'(': getNextToken := tkOpen;
')': getNextToken := tkClose;
end;
st := ''; delete(s, 1, 1)
end;
'-', '+', '*', '/':
begin
case s[1] of
'+': getNextToken := tkPlus;
'-': getNextToken := tkMinus;
'*': getNextToken := tkMult;
'/': getNextToken := tkDiv;
end;
st := s[1]; delete(s, 1, 1);
end
else
begin
st := '';
while (s <> '') and (s[1] in ['0'..'9', '.']) do
begin
st := st + s[1];
delete(s, 1, 1);
end;
getNextToken := tkNumber
end;
end
end;

const
s: string = '2 3 + 4 * 5 +';
var
sToken: string;
nextToken, from: TokenType;
sres: string;
myStack: TStack;

T: TType;
ErrCode: Integer;


begin
initStack(myStack);

while s <> '' do
begin
nextToken := getNextToken(s, sToken);
case nextToken of
tkNumber:
Begin
Val(sToken, T, ErrCode);
pushStack(myStack, T);
End;
tkPlus:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)+T)
End;
tkMinus:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)-T)
End;
tkDiv:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)/T)
End;
tkMult:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)*T)
End;
end
end;

Writeln(PopStack(myStack):10:5);
end.
panTILImon
Спасиба БАЛЬШОЕ!!!!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.