Chuyển biểu thức từ trung tố sang hậu tố

Một phần của tài liệu CẤU TRÚC dữ LIỆU ĐỘNG (Trang 25)

2. NGĂN XẾP – STACK

2.4.3Chuyển biểu thức từ trung tố sang hậu tố

Thuật toán để chuyển một biểu thức Infix sang dạn Prefix:

Đọc từng phần tử trong biểu thức infix từ trái qua phải, với mỗi phần tử ta thực hiện các bước sau:

Nếu là toán hạng: cho ra output.

Nếu là dấu mở ngoặc “(“: cho vào stack

Nếu là dấu đóng ngoặc “)”: lấy các toán tử trong stack ra và cho vào output cho đến khi gặp dấu mở ngoặc “(“. (Dấu mở ngoặc cũng phải được đưa ra khỏi stack)

Nếu là toán tử: Chừng nào ở đỉnh stack là toán tử và toán tử đó có độ ưu tiên lớn hơn hoặc bằng toán tử hiện tại thì lấy toán tử đó ra khỏi stack và cho ra output.

Đưa toán tử hiện tại vào stack

Sau khi duyệt hết biểu thức infix, nếu trong stack còn phần tử thì lấy các phần tử trong đó ra và cho lần lượt vào output.

program ConvertInfixToRPN; uses crt;

const

Opt = ['(', ')', '+', '-', '*', '/']; var

T, Infix, Stack: string; {Stack dùng chứa toán tử và dấu ngoặc nên dùng String cho tiện}

p: integer;

{Các thao tác với Stack}

procedure StackInit; {Khởi tạo Stack} begin

stack := ''; end;

procedure Push(V: char); {Thêm phần tử V vào Stack} begin

end;

function Pop: Char; {Lấy phần tử ra khỏi Stack} begin

Pop := stack[length(stack)]; dec(stack[0]);

end;

function Get: char; begin

Get := stack[length(stack)]; end;

{--- ---}

procedure Refine(var S: string); {Hiệu chỉnh biểu thức trung tố về dạng dễ đọc nhất}

var

i: integer; begin

s:=s + ' ';

for i := length(s) - 1 downto 1 do {Thêm những dấu cách trước và sau nhữg toán tử và dấu ngoặc} if (s[i] in Opt) or (s[i+1] in Opt) then Insert(' ', s, i + 1);

for i := length(s) - 1 downto 1 do {Xóa nhữg dấu cách thừa}

if (s[i] = ' ') and (s[i + 1] = ' ') then Delete(s, i+1, 1); (adsbygoogle = window.adsbygoogle || []).push({});

end;

function Priority(Ch: char): integer; {Hàm lấy mức độ ưu tiên của Ch}

begin case ch of '*', '/': Priority := 2; '+', '-': Priority := 1; '(' : Priority := 0; end; end;

procedure Process(T: string); {Xử lý một toán tử đọc đc từ bthức trung tố}

var

begin

c := t[1];

if not (c in Opt) then Write(T, ' ') else case c of '(': Push(c); ')': Repeat x := Pop; if x <> '(' then Write(x, ' '); Until x = '('; '+', '-', '*', '/': begin

while (stack <> '') and (Priority(c) <= Priority(Get)) do write(Pop, ' '); Push(c); end; end; end; begin Clrscr; Write('Infix = '); ReadLn(Infix); Refine(Infix); WriteLn('Refined: ',Infix); Write('RPN: '); T := ''; for p := 1 to Length(Infix) do

if infix[p] <> ' ' then T := T + infix[p] else

begin

process(t); T := ''; end;

while Stack <> '' do Write(Pop, ' '); WriteLn;

ReadLn; end.

Một phần của tài liệu CẤU TRÚC dữ LIỆU ĐỘNG (Trang 25)