Добрий вечір.
Потрібна допомога у обчисленні створеного Зворотнього Польського Запису. Сам алгоритм обчислення я розумію, але я не можу його представити у програмному вигляді.
На даний момент є лише код програми яка створює запис.
▼Код
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
XPManifest1: TXPManifest;
procedure Button1Click(Sender: TObject);
procedure Push(Sumb:char);
procedure Pop(var Sumb:char);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Stack = ^Element;
Element = record
Op:Char;
Next:stack;
end;
var
Form1: TForm1;
Head:Stack;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i:Byte; l:real; sm:Char;
begin
Edit2.Text:='';
New(Head); Head^.Next := nil;
i := 1;
while i <= Length(Edit1.Text) do
begin
case Edit1.Text[i] of
'(': push('(');
')': begin
Pop(sm);
while sm <> '(' do
begin
Edit2.Text := Edit2.Text + sm;
Pop(sm);
end;
end;
'+','-': begin
if (Head.Op = '+') or (Head.Op = '-') then
begin
Pop(sm);
Edit2.Text := Edit2.Text + sm;
end;
Push(Edit1.Text[i]);
end;
'*','/': begin
if (Head.Oper = '*')or(Head.Oper = '/')then
begin
Pop(sm);
Edit2.Text := Edit2.Text + sm;
end;
push(Edit1.text[i]);
end;
else
Edit2.Text := Edit2.Text + Edit1.Text[i];
end;
inc(i);
end;
while head^.next <> nil do
begin
Pop(sm);
Edit2.Text := Edit2.Text+sm;
end;
end;
procedure TForm1.Pop(var Sumb: char);
begin
Sumb := Head^.Oper;
Head := Head^.next;
end;
procedure TForm1.Push(sumb: char);
var Elem:Stack;
begin
New(Elem);
Elem^.Oper := Sumb;
Elem^.Next := Head;
head:=Elem;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
end.
Проблема полягає саме в тому, що я не знаю як стрічку перетворити таким чином, щоб можна було виконувати арифметичні операції.
P.S. Вираз задається у вигляді запису чисел, наприклад: (6+8)/(15-8)