Bạn có thể tưởng tượng ngăn xếp đang phát triển từ dưới cùng, với phần tử dưới cùng (tức là lần đầu tiên được đẩy) có chỉ mục 1, sau đó bạn đẩy phần tử khác (chỉ mục 2), sau đó thêm phần tử khác (chỉ mục 3), v.v. Vì vậy, bạn có tình trạng này:
+-----------------------+
| element with index 6 | <-- top ("relative" index -1)
+-----------------------+
| element with index 5 | <-- -2
+-----------------------+
| element with index 4 | <-- -3
+-----------------------+
| element with index 3 | <-- -4
+-----------------------+
| element with index 2 | <-- -5
+-----------------------+
| element with index 1 | <-- bottom ("relative" index -6)
+-----------------------+
bạn cũng có thể nói rằng "chỉ số bình thường" (một trong những chỉ mục từ dưới lên) là chỉ số tuyệt đối của nguyên tố này (tương tự như của một mảng trong C, bên cạnh bắt đầu từ 1). Thay vào đó, chỉ mục phủ định là "tương đối" ở đầu ngăn xếp. lua_gettop
cung cấp cho bạn chỉ số tuyệt đối của đầu ngăn xếp (luôn có chỉ số tương đối -1
).
Tại sao có hai cách lập chỉ mục ngăn xếp, sau đó? Bởi vì đôi khi nó rất hữu ích để truy cập vào các phần tử giống như một mảng (sử dụng một chỉ mục tuyệt đối) và đôi khi bạn chỉ cần truy cập vào các phần tử được đẩy cuối cùng (để lập chỉ mục từ trên cùng).
BTW, tôi thường hình dung ngăn xếp Lua đảo ngược: bắt đầu từ phía trên và phát triển xuống dưới (tức là ngăn xếp nằm ở cuối bản trình bày tinh thần của tôi). Tôi thấy mô hình tinh thần này hữu ích hơn vì tôi giải thích chỉ mục -1 là "bước trở lại mã (trở lên, do đó) cho đến khi bạn tìm thấy lần đẩy đầu tiên". Trong thời trang này, chỉ số -2 sẽ là "bước trở lại mã cho đến khi bạn tìm thấy lần đẩy thứ hai", v.v. Tất cả điều này giúp tôi nhanh chóng xác định nơi tôi đã đẩy nội dung gì.
Tuy nhiên, để tránh nhầm lẫn, ở đây tôi đã sử dụng một biểu diễn cổ điển hơn, nơi đầu ngăn xếp được vẽ thực sự ở trên cùng!
Nguồn
2013-08-26 19:19:01
'lua_gettop()' là một hàm, trong khi '-1' là một số nguyên theo nghĩa đen. –
Bạn có nghĩ tôi ngốc không? – deepspace
Không, tôi không biết. Tuy nhiên, câu hỏi của bạn không phù hợp với Stack Overflow. –