Xây dựng một bộ định giá biểu thức (expression evaluator) hoàn chỉnh cho một ngôn ngữ nhỏ có: số nguyên không âm, các toán tử hai ngôi +,−,×,÷, ^ (+ - * / ^), dấu ngoặc ( ), và dấu trừ một ngôi (unary minus, ví dụ -3, -(1+2)).
Quy ước độ ưu tiên (từ cao xuống thấp):
^ (lũy thừa) — kết hợp phải;-) — áp dụng cho toán hạng ngay sau nó theo cùng quy tắc kết hợp phải, và có độ ưu tiên thấp hơn ^ nhưng cao hơn *, / (giống quy ước của Python: -2**2 =−4, không phải 4; còn 2**-3 =2−3);*, / — kết hợp trái;+, - (hai ngôi) — kết hợp trái, thấp nhất.Số mũ (toán hạng bên phải của ^) luôn được đảm bảo định giá ra một số nguyên (có thể âm). Phép chia /, và phép lũy thừa với số mũ âm của cơ số 0, đều phải tính chính xác bằng phân số (không dùng số thực dấu phẩy động) để tránh sai số.
Nếu tại bất kỳ bước nào xảy ra chia cho 0 (kể cả 0 mũ một số nguyên âm), in ra KHONG XAC DINH và dừng.
Ví dụ: 2^-3 được hiểu là 2−3=81.
Một dòng chứa biểu thức, có thể có hoặc không có khoảng trắng, gồm các chữ số, các ký tự + - * / ^ ( ). Chỉ dấu - đứng ở đầu biểu thức, ngay sau (, hoặc ngay sau một toán tử khác mới là dấu trừ một ngôi; các trường hợp còn lại là toán tử trừ hai ngôi.
Nếu kết quả là số nguyên, in ra số nguyên đó. Nếu kết quả là phân số không nguyên, in ra dưới dạng p/q tối giản với q>0 (dấu âm nếu có được đặt ở tử số p). Nếu có chia cho 0 (bao gồm lũy thừa âm của cơ số 0), in ra đúng chuỗi KHONG XAC DINH.
Ví dụ:
Đầu vào:
3+4*2
Đầu ra:
11
Đầu vào:
-2^2
Đầu ra:
-4
Đang tải editor...