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ô phỏng máy ảo ngăn xếp với DUP, SWAP, POP

    Một máy ảo ngăn xếp (stack machine) đơn giản dùng trong sinh mã trung gian của trình biên dịch hỗ trợ các lệnh sau, thao tác trên một ngăn xếp số nguyên ban đầu rỗng:

    • 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 — gọi bbb là phần tử lấy ra trước (tức đang ở đỉnh), aaa là phần tử lấy ra sau (nằm ngay dưới bbb) — rồi tính lần lượt a+ba+ba+b, a−ba-ba−b, a×ba\times ba×b, hoặc a  /  ba \;/\; ba/b (chia lấy phần nguyên kiểu Python, tức làm tròn xuống — floor division, ví dụ (−7)  /  2=−4(-7) \;/\; 2 = -4(−7)/2=−4) và đẩy kết quả trở lại ngăn xếp.
    • POP: bỏ đi phần tử ở đỉnh ngăn xếp (không đẩy gì thay thế).
    • DUP: nhân đôi phần tử ở đỉnh (đẩy thêm một bản sao của giá trị đang ở đỉnh).
    • SWAP: hoán đổi vị trí 2 phần tử trên cùng của ngăn xếp.

    Cho một chương trình gồm các lệnh trên, hãy mô phỏng và cho biết nội dung ngăn xếp sau khi thực thi xong toàn bộ chương trình.

    Ví dụ: chương trình PUSH 1 / PUSH 2 / DUP / SWAP / ADD cho ngăn xếp cuối là 1 4 (đáy tới đỉnh).

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

      Dòng đầu tiên chứa số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000) — số lệnh. nnn dòng tiếp theo, mỗi dòng là một lệnh có dạng PUSH x (x là số nguyên, có thể âm) hoặc một trong các từ khóa ADD, SUB, MUL, DIV, POP, DUP, SWAP (không kèm tham số). Đề bảo đảm chương trình hợp lệ: tại mọi thời điểm, ngăn xếp luôn có đủ số phần tử cần thiết cho lệnh đang thực hiện, và không có phép chia cho 0.

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

      In ra đúng một dòng chứa nội dung ngăn xếp cuối cùng theo thứ tự từ đáy tới đỉnh, các số nguyên cách nhau bởi một khoảng trắng. Nếu ngăn xếp rỗng, in ra một dòng trống.

    Ví dụ:

    Đầu vào:

    0
    

    Đầu ra:

    
    

    Đầu vào:

    3
    PUSH 3
    PUSH 4
    ADD
    

    Đầu ra:

    7
    

    Đang tải editor...