Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Máy ảo ngăn xếp: biểu thức số học

    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 xxx 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 bbb là phần tử ở đỉnh (lấy ra trước) và aaa 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+ba+ba+b, a−ba-ba−b, a×ba \times ba×b, a÷ba \div ba÷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(-7) \div 2 = -3(−7)÷2=−3 (không phải −4-4−4), 7÷(−2)=−37 \div (-2) = -37÷(−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.

    • Định dạng đầu vào:

      Dòng đầu tiên chứa số nguyên nnn (1≤n≤10001 \le n \le 10001≤n≤1000) — số lượng dòng lệnh. nnn 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).

    • Định dạng đầu ra:

      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...