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 có bộ nhớ biến

    Khi sinh mã cho các câu lệnh gán biến, máy ảo ngăn xếp cần thêm một vùng bộ nhớ biến (biểu diễn bằng mảng) bên cạnh ngăn xếp tính toán. Cho một máy ảo với ngăn xếp và một mảng bộ nhớ gồm mmm ô nhớ đánh số từ 000 đến m−1m-1m−1, tất cả khởi tạo bằng 000.

    Chương trình gồm nnn lệnh, mỗi lệnh thuộc một trong các dạng:

    • PUSH x: đẩy hằng số nguyên xxx vào đỉnh ngăn xếp.
    • LOAD i: đẩy giá trị hiện tại của ô nhớ iii vào đỉnh ngăn xếp (không thay đổi bộ nhớ).
    • STORE i: lấy (pop) giá trị ở đỉnh ngăn xếp ra và ghi đè vào ô nhớ iii.
    • ADD, SUB, MUL: pop hai phần tử bbb (đỉnh) và aaa (ngay dưới), đẩy lại a op ba \ \text{op} \ ba op b.

    Dữ liệu vào đảm bảo ngăn xếp luôn đủ phần tử khi cần pop, và mọi chỉ số iii hợp lệ (0≤i<m0 \le i < m0≤i<m). Sau khi thực hiện xong toàn bộ chương trình, hãy in ra trạng thái cuối cùng của toàn bộ mảng bộ nhớ.

    Ví dụ: với n=5,m=2n=5, m=2n=5,m=2 và chương trình PUSH 5, STORE 0, PUSH 3, LOAD 0, ADD: ô nhớ 0 được gán giá trị 5, ô nhớ 1 không bao giờ bị ghi nên vẫn là 0 (dù ngăn xếp cuối cùng còn giá trị 8, giá trị đó không được lưu vào bộ nhớ). Kết quả: 5 0.

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

      Dòng đầu tiên chứa hai số nguyên nnn và mmm (0≤n≤20000 \le n \le 20000≤n≤2000, 1≤m≤1001 \le m \le 1001≤m≤100). nnn dòng tiếp theo, mỗi dòng là một lệnh theo đúng định dạng nêu trên.

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

      In ra một dòng gồm mmm số nguyên (giá trị cuối cùng của các ô nhớ 0,1,…,m−10, 1, \ldots, m-10,1,…,m−1), cách nhau bởi khoảng trắng.

    Ví dụ:

    Đầu vào:

    5 2
    PUSH 5
    STORE 0
    PUSH 3
    LOAD 0
    ADD

    Đầu ra:

    5 0
    

    Đầu vào:

    2 1
    PUSH 9
    STORE 0

    Đầu ra:

    9
    

    Đang tải editor...