Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на Обратную Польскую Нотацию (постфикс)
Форум «Всё о Паскале» > 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
Спасиба БАЛЬШОЕ!!!!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.