Interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Menus;
type
{ TForm3 }
TForm3 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
MainMenu1: TMainMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: char);
procedure MenuItem2Click(Sender: TObject);
private
public
end;
var
Form3: TForm3;
Implementation
Type pt_1=^el_1;
el_1=Record //описание стека для первой части программы
data:Char;
next:pt_1;
End;
Var s:String;
rez_1, rez_2:String;
{$R *.lfm}
{ TForm3 }
Procedure WriteStack_1(Var u:pt_1; dig:Char);
//запись в стек
//u – указатель на начало стека
//dig – значение символа, которое записывается в стек
Var x: pt_1;
Begin
New(x);
x^.data:=dig; x^.next:=u;
u:=x;
End;
Procedure ReadStack_1(Var u:pt_1; Var dig:Char);
//извлечение из стека
//u – указатель на начало стека
//dig – значение символа, которое извлекается из стека
Var x: pt_1;
Begin
dig:=u^.Data;
x:=u;
u:=u^.Next; Dispose(x);
End;
Function Priority(c: Char): Byte;
Var R:Byte;
Begin
R := 0;
Case c of
'+', '-': R:= 1;
'*', '/', '^': R:= 2;
end;
Priority:=R;
End;
Function Free_1(u:pt_1):Boolean;
//u – указатель на начало стека
Begin
If u=Nil Then Free_1:=False Else Free_1:= True;
End;
Procedure Convert_expression (a:String;Var z:String); // Постфиксная форма из инфиксной
Var head:pt_1;
i:Integer;
w:Char;
Begin
head:=Nil;
z:='';
i:=1;
While i<=Length(a) Do
Begin
Case a[i] of
'0'..'9': z:=z+a[i];
'a'..'z': z:=z+a[i];
'A'..'Z': z:=z+a[i];
'(': WriteStack_1(head,a[i]);
')': Begin //Считываем из стека до символа «(»
ReadStack_1(head,w);
While w<>'(' Do
Begin z:=z+w; ReadStack_1(head,w); End;
End;
'+','-','*','/','^':
begin
If not Free_1(head) Then WriteStack_1(head,a[i])
else
begin
w:=head^.data;
While Free_1(head)and(Priority(head^.data)>= Priority(a[i]))
do
Begin ReadStack_1(head,w);z:=z+w; End;
WriteStack_1(head,a[i]) ;
end;
end;
End;
Inc(i);
End;
//Дополняем строку символами операций, запомненных в стеке
While Free_1(head) Do Begin ReadStack_1(head,w); z:=z+w; End;
End;
Procedure Convert_expression_2 (a:String;Var z:String); // Перевод из постфиксной в префиксную
var
stat:integer;
i:integer;
s:string;
begin
z:='';
i:=1;
While i<=Length(a) Do begin
case a[i] of
'0'..'9': stat:=0;
'a'..'z': stat:=0;
'A'..'Z': stat:=0;
' ' : stat:=0;
'+','-','*','/','^': stat:=1;
end;
if stat = 1 then begin
s:= a[i] + a[i-2] + a[i-1];
if (s[2]= ' ') or (s[3] = ' ') then
z:= s[1] + s[2] + z + s[3]
else z:= z + s;
a:= StringReplace(a, a[i-2] + a[i-1] + a[i], ' ',
[rfReplaceAll, rfIgnoreCase]);
i:=0;
end;
inc(i);
end;
z := StringReplace(z ,' ','', [rfReplaceAll, rfIgnoreCase]);
end;
procedure TForm3.MenuItem2Click(Sender: TObject); // Задание
begin
ShowMessage(' 1. Используя стек, реализовать алгоритм преобразования алгебраиче'+
'ского выражения из инфиксной формы записи в постфиксную форму пред'+
'ставления.'+ #13 + '2. Используя стек, реализовать алгоритм преобразования алгебраиче'+
'ского выражения из инфиксной формы записи в префиксную форму пред'+
'ставления.' + #13 + 'Для обоих алгоритмов предусмотреть вхождение операций с различны'+
'ми приоритетами, а также наличие скобок в инфиксных выражениях.')
end;
procedure TForm3.Button1Click(Sender: TObject); // Перевод!
begin
If Edit1.text = '' then begin
ShowMessage ('Нельзя ввести пустую строку!');
exit;
end;
if length(Edit1.text)<3 then begin
ShowMessage ('Слишком короткая запись!');
exit;
end;
s:= Edit1.Text;
Convert_expression(s,rez_1);
Edit2.Text:=rez_1;
Convert_expression_2(rez_1,rez_2);
Edit3.Text:=rez_2;
end;
procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: char); // Ограничение ввода
begin
if not (Key in ['0'..'9', #8]) then
if not (Key in ['a'..'z', #8]) then
if not (Key in ['A'..'Z', #8]) then
if not (Key in ['+','-','*','/','^','(',')', #8]) then
Key := #0;
end;
end.