Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

Library: List Queue and Stack Operations

Soen Eber
Registered User
Join date: 3 Aug 2006
Posts: 428
03-22-2008 07:31
Limitations:
1 - currently operates on strings only.
2 - limited to one stack or queue at a time.
3 - must assign stack/queue to global list variable gStack before use.

CODE

list gStack;

string lPop()
{
string s = llList2String(gStack,0);
if (llGetListLength(gStack) > 1) gStack = llList2List(gStack,1,-1);
else if (llGetListLength(gStack) == 1) gStack = [];
return s;
}
string rPop()
{
string s = llList2String(gStack,-1);
if (llGetListLength(gStack) > 1) gStack = llList2List(gStack,0,-2);
else if (llGetListLength(gStack) == 1) gStack = [];
return s;
}
string lGet()
{
string s = llList2String(gStack,0);
return s;
}
string rGet()
{
string s = llList2String(gStack,-1);
return s;
}
lPush(string item)
{
gStack = [item]+gStack;
}
rPush(string item)
{
gStack = gStack+[item];
}
default
{
state_entry()
{
}
touch_start(integer total_number)
{
string s;
list lTest = ["c","d","e"];
gStack = lTest;
llSay(0,"________start________");
llSay(0,"stack="+llList2CSV(gStack));

// Test lPush, lGet, lPop
lPush("b");
llSay(0,"after lPush(b) s="+s+", stack="+llList2CSV(gStack));
s = lGet();
llSay(0,"after lGet() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));

// Test rPush, rGet, rPop
rPush("f");
llSay(0,"after rPush(f) s="+s+", stack="+llList2CSV(gStack));
s = rGet();
llSay(0,"after rGet() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));

// Drain the queue leftside and repopulate
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
lPush("c");
llSay(0,"after lPush(c) s="+s+", stack="+llList2CSV(gStack));
lPush("b");
llSay(0,"after lPush(b) s="+s+", stack="+llList2CSV(gStack));
lPush("a");
llSay(0,"after lPush(a) s="+s+", stack="+llList2CSV(gStack));

// Drain the queue rightside and repopulate
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
rPush("a");
llSay(0,"after rPush(a) s="+s+", stack="+llList2CSV(gStack));
rPush("b");
llSay(0,"after rPush(b) s="+s+", stack="+llList2CSV(gStack));
rPush("c");
llSay(0,"after rPush(c) s="+s+", stack="+llList2CSV(gStack));

llSay(0,"________end__________");
}
}
Strife Onizuka
Moonchild
Join date: 3 Mar 2004
Posts: 5,887
03-23-2008 00:07
Optimized Version:

CODE

list gStack;

string lPop()
{
string s = llList2String(gStack,0);
gStack = llDeleteSubList(gStack,0,0);
return s;
}
string rPop()
{
string s = llList2String(gStack,-1);
gStack = llDeleteSubList(gStack,-1,-1);
return s;
}
string lPeek()//should inline this
{
return llList2String(gStack,0);
}
string rPeek()//should inline this
{
return llList2String(gStack,-1);
}
lPush(string item)//should inline this
{
gStack = item+gStack;
}
rPush(string item)//should inline this
{
gStack = gStack+item;
}
default
{
touch_start(integer total_number)
{
string s;
list lTest = ["c","d","e"];
gStack = lTest;
llSay(0,"________start________");
llSay(0,"stack="+llList2CSV(gStack));

// Test lPush, lGet, lPop
lPush("b");
llSay(0,"after lPush(b) s="+s+", stack="+llList2CSV(gStack));
s = lPeek();
llSay(0,"after lPeek() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));

// Test rPush, rPeek, rPop
rPush("f");
llSay(0,"after rPush(f) s="+s+", stack="+llList2CSV(gStack));
s = rPeek();
llSay(0,"after rPeek() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));

// Drain the queue leftside and repopulate
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
s = lPop();
llSay(0,"after lPop() s="+s+", stack="+llList2CSV(gStack));
lPush("c");
llSay(0,"after lPush(c) s="+s+", stack="+llList2CSV(gStack));
lPush("b");
llSay(0,"after lPush(b) s="+s+", stack="+llList2CSV(gStack));
lPush("a");
llSay(0,"after lPush(a) s="+s+", stack="+llList2CSV(gStack));

// Drain the queue rightside and repopulate
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
s = rPop();
llSay(0,"after rPop() s="+s+", stack="+llList2CSV(gStack));
rPush("a");
llSay(0,"after rPush(a) s="+s+", stack="+llList2CSV(gStack));
rPush("b");
llSay(0,"after rPush(b) s="+s+", stack="+llList2CSV(gStack));
rPush("c");
llSay(0,"after rPush(c) s="+s+", stack="+llList2CSV(gStack));

llSay(0,"________end__________");
}
}
_____________________
Truth is a river that is always splitting up into arms that reunite. Islanded between the arms, the inhabitants argue for a lifetime as to which is the main river.
- Cyril Connolly

Without the political will to find common ground, the continual friction of tactic and counter tactic, only creates suspicion and hatred and vengeance, and perpetuates the cycle of violence.
- James Nachtwey