Một máy ảo ngăn xếp (stack-based virtual machine) thực thi chương trình bytecode gồm các dòng lệnh sau đây, mỗi dòng là một lệnh:
PUSH x: đẩy số nguyên x vào đỉnh ngăn xếp.ADD, SUB, MUL, DIV: lấy ra 2 phần tử trên đỉnh ngăn xếp, gọi b là phần tử ở đỉnh (lấy ra trước) và a là phần tử ngay dưới (lấy ra sau), rồi đẩy vào ngăn xếp kết quả tương ứng a+b, a−b, a×b, a÷b.PRINT: in ra giá trị đang ở đỉnh ngăn xếp (không lấy phần tử này ra khỏi ngăn xếp).HALT: dừng thực thi ngay lập tức, các lệnh phía sau (nếu còn) không được thực hiện.Với phép DIV, kết quả được lấy phần nguyên làm tròn về 0 (truncate toward zero), giống phép chia số nguyên trong C/C++/Java — nghĩa là kết quả có dấu bằng dấu của thương toán học, phần dư luôn cùng dấu với số bị chia. Ví dụ (−7)÷2=−3 (không phải −4), 7÷(−2)=−3.
Cho một chương trình bytecode, hãy mô phỏng việc thực thi và in ra các giá trị theo đúng thứ tự các lệnh PRINT được thực hiện.
Ví dụ: chương trình
PUSH 3
PUSH 4
ADD
PRINT
PUSH 2
MUL
thực thi: đẩy 3, đẩy 4, ADD cho ra 7 (đỉnh ngăn xếp là 7), PRINT in ra 7, rồi đẩy 2 và nhân — chương trình kết thúc (không có PRINT nào khác). Kết quả in ra chỉ có một dòng 7.
Dòng đầu tiên chứa số nguyên n (1≤n≤1000) — số lượng dòng lệnh. n dòng tiếp theo, mỗi dòng là một lệnh theo đúng cú pháp mô tả ở trên (PUSH x, ADD, SUB, MUL, DIV, PRINT, hoặc HALT). Dữ liệu đảm bảo ngăn xếp không bao giờ bị thiếu phần tử khi thực thi (không underflow) và không có phép DIV nào chia cho 0 trong quá trình thực thi thực tế (các lệnh sau HALT, nếu có, có thể vi phạm nhưng sẽ không được thực thi).
In ra mỗi giá trị được lệnh PRINT xuất ra trên một dòng riêng, theo đúng thứ tự thực thi. Nếu chương trình không có lệnh PRINT nào được thực thi, không in gì cả.
Ví dụ:
Đầu vào:
1
HALT
Đầu ra:
Đầu vào:
6
PUSH 3
PUSH 4
ADD
PRINT
PUSH 2
MUL
Đầu ra:
7
Đang tải editor...