Программеры, решите пожалуйста задачку.
Дана string и в ней записано мат. выражение в постфиксной форме. Нужно подсчитать резутьтат. (используются знаки +, -, /, * (, ), и только целые числа)
Заранее СПАСИБА...
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.