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 bytecode

    Thiết kế trình thông dịch cho một máy ảo dựa trên ngăn xếp (stack machine), thực thi tuần tự các lệnh bytecode sau (mỗi dòng 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 hai giá trị trên đỉnh ngăn xếp — gọi bbb là giá trị lấy ra trước (đỉnh), aaa là giá trị lấy ra ngay sau — rồi đẩy vào kết quả a+ba+ba+b, a−ba-ba−b, a×ba\times ba×b hoặc a÷ba \div ba÷b tương ứng (phép chia lấy phần nguyên làm tròn về 0; dữ liệu đảm bảo không chia cho 0).
    • DUP: nhân đôi giá trị đang ở đỉnh ngăn xếp (đẩy thêm một bản sao của nó).
    • POP: loại bỏ giá trị ở đỉnh ngăn xếp, không in ra gì.
    • PRINT: in ra giá trị đang ở đỉnh ngăn xếp (không loại bỏ khỏi ngăn xếp).
    • HALT: dừng thực thi ngay lập tức; mọi lệnh phía sau (nếu có) bị bỏ qua hoàn toàn.

    Chương trình được đảm bảo hợp lệ: ngăn xếp luôn có đủ phần tử cần thiết khi thực hiện mỗi lệnh. Nếu chương trình không chứa HALT, việc thực thi dừng lại khi đã xử lý hết danh sách lệnh.

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

      Dòng đầu là số nguyên nnn (1≤n≤20001 \le n \le 20001≤n≤2000) — số lệnh. nnn dòng tiếp theo, mỗi dòng là một lệnh; riêng lệnh PUSH có thêm một số nguyên xxx cách bởi khoảng trắng, ví dụ PUSH -3.

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

      In ra lần lượt các giá trị mà lệnh PRINT xuất ra trong quá trình thực thi, mỗi giá trị một dòng, theo đúng thứ tự. Nếu không có PRINT nào được thực thi, không in gì cả (output rỗng).

      Ví dụ:

      Input:

      7
      PUSH 3
      PUSH 4
      ADD
      DUP
      PRINT
      PUSH 2
      MUL
      

      Output:

      7
      

    Ví dụ:

    Đầu vào:

    7
    PUSH 3
    PUSH 4
    ADD
    DUP
    PRINT
    PUSH 2
    MUL
    

    Đầu ra:

    7
    

    Đầu vào:

    5
    PUSH 1
    PUSH 2
    HALT
    ADD
    PRINT
    

    Đầu ra:

    
    

    Đang tải editor...