因為受到經濟危機的影響,我在 bokee.com 的部落格可能隨時出現無法訪問的情況;因此將2023年到2023年間在 bokee.com 撰寫的部落格文章全部遷移到 csdn 部落格中來,本文正是其中一篇遷移的文章。
lua提供了如下的基礎堆疊操作api:
void lua_settop (lua_state* l, int index );
void lua_pushvalue (lua_state* l, int index);
void lua_remove (lua_state* l, int index);
void lua_insert (lua_state* l, int index);
void lua_replace (lua_state* l, int index);
lua_settop用於把堆疊的棧頂索引設定為指定的數值,它可以接受所有可接受索引。如果新的棧頂索引比原來的大,則新的位置用nil填充。如果index為0,則將刪除堆疊中的所有元素。在lua.h中定義了如下乙個巨集:
#define lua_pop(l,n) lua_settop(l,-(n)-1)
用以把堆疊上部的n個元素刪除。
lua_pushvalue壓入乙個元素的值拷貝到指定的索引處,相反地,lua_remove刪除給定索引的元素,並將之一索引之上的元素來填補空缺。同樣地,lua_insert在上移給定索引之上的所有元素後再在指定位置插入新元素。lua_replace將棧頂元素壓入指定位置而不移動任何元素(因此指定位置的元素的值被替換)。這些函式都僅接受有效索引(你不應當使用假索引呼叫lua_remove或lua_insert,因為它不能解析為乙個堆疊位置)。下面是乙個例子,棧的初始狀態為10 20 30 40 50 *(從棧底到棧頂,「*」標識為棧頂,有:
lua_pushvalue(l, 3) --> 10 20 30 40 50 30*
lua_pushvalue(l, -1) --> 10 20 30 40 50 30 30*
lua_remove(l, -3) --> 10 20 30 40 30 30*
lua_remove(l, 6) --> 10 20 30 40 30*
lua_insert(l, 1) --> 30 10 20 30 40*
lua_insert(l, -1) --> 30 10 20 30 40* (沒影響)
lua_replace(l, 2) --> 30 40 20 30*
lua_settop(l, -3) --> 30 40*
lua_settop(l, 6) --> 30 40 nil nil nil nil*
檢測堆疊元素的資料型別可以使用如下函式:
int lua_type (lua_state *l, int index);
int lua_isnil (lua_state *l, int index);
int lua_isboolean (lua_state *l, int index);
int lua_isnumber (lua_state *l, int index);
int lua_isstring (lua_state *l, int index);
int lua_istable (lua_state *l, int index);
int lua_isfunction (lua_state *l, int index);
int lua_iscfunction (lua_state *l, int index);
int lua_isuserdata (lua_state *l, int index);
int lua_islightuserdata (lua_state *l, int index);
這些函式可用任意可打接受索引為引數。
lua_type返回堆疊元素的值型別,當使用無效索引時返回lua_tnone(如當堆疊為空的時候)。lua_type返回的型別**為如下在lua.h中定義的常量:lua_tnil,lua_tnumber,lua_tboolean,lua_tstring,lua_ttable,lua_tfunction,lua_userdata,lua_ttheard,lua_tlightuserdata。下面的函式可以將這些常量轉換為字串:
const char* lua_typename (lua_state* l, int type);
帶lua_is*前輟的函式在當堆疊元素物件與給定的型別相容時返回1,否則返回0。lua_isboolean是個例外,它僅在元素型別為布林型時成功(否則沒有意思,因為任何值都可看作布林型)。當使用無效索引時,它們總返回0。lua_isnumber接受數字或者全部為數字的字串;lua_isstring打接受字串和數值,lua_isfunction接受lua函式和c函式;lua_isuserdata也可接受完全和輕量級兩種userdata。如果想區分c函式和lua函式,可以使用lua_iscfunction函式;同樣地,想區分完全和輕量級userdata可以使用lua_islightuserdata;區分數字和數字組成的字串可以使用lua_type。
api函式中還有比較堆疊中的兩個值 的大小的函式:
int lua_equal (lua_state *l, int index1, int index2);<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
int lua_rawequal (lua_state *l, int index1, int index2);
int lua_lessthan (lua_state *l, int index1, int index2);
lua_equal和lua_lessthan與相對應的lua操作符等價(參考<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2.5.2
)。lua_rawequal直接判斷兩個值的原始值,而非通過呼叫元方法來比較。以上的函式當索引無效時返回0。
Lua manual翻譯 第三章第三 四節
因為受到經濟危機的影響,我在 bokee.com 的部落格可能隨時出現無法訪問的情況 因此將2005年到2006年間在 bokee.com 撰寫的部落格文章全部遷移到 csdn 部落格中來,本文正是其中一篇遷移的文章。lua提供了如下的基礎堆疊操作api void lua settop lua st...
第三章 堆疊
1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...
第三章 曙光
第三章 曙光 第二場校園招聘開始了。其實,洋對這個公司的不是很了解。因為前幾天突然在bbs上面看到了這個公司的招聘資訊,洋覺得這個公司不錯,就上網投了簡歷。接下來的乙個多小時,讓洋很震撼!想不到這個公司這個厲害,而且無論從哪方面來說,絕對不比之前的那個公司差。想不到自己的乙個不經意的決定到了這個大的...