題目:將編號0和1的兩個棧存放於乙個空間v[m]的陣列空間中,棧底分別處於陣列的兩端。當第0號棧的棧頂指標top[0]=-1時該棧為空;當第1號棧的棧頂指標top[1]=m時,該棧為空。兩個棧均從兩端向中間增長(如下圖)。試編寫雙棧初始化,判斷棧空,棧滿,進棧,出棧等演算法的函式。
雙棧結構的定義如下:
1.雙棧初始化
思路:為雙棧空間分配乙個大小為m的陣列空間。0號棧的棧頂指標和棧底指標的初始值都是-1;1號棧的棧頂指標和棧底指標的初始值都是m。表示棧空。
演算法:
status initstack(dblstack &s, int m)
s.top[0]=-1;
s.bot[0]=-1;
s.top[1]=m;
s.bot[1]=m;
return ok;
}
演算法:
status dblstackempty(dblstack &s)else
}
3.判斷雙棧是否滿
思路:當s.top[0]和s.top[1]相鄰即s.top[1]-s.top[0]==1時,表示棧滿。
演算法:
status dblstackfull(dblstack &s)
4.進棧
思路:首先判斷雙棧是否滿,若滿返回error;若不滿,將e1存到0號棧的棧頂,e2存到1號棧的棧頂,0號棧的棧頂指標向右移,1號棧的棧頂指標向左移。 (左右移是針對上圖)
演算法:
status push(dblstack &s,int e1,int e2)
s.v[++s.top[0]]=e1; //e1存到0號棧棧頂,棧頂元素右移
s.v[--s.top[1]]=e2; //e2存到1號棧棧頂,棧頂元素左移
return ok;
}
5.出棧
思路:首先判斷雙棧是否為空,若為空,則返回error;若不為空,則將0號棧的棧頂元素的值賦給e1,1號棧的棧頂元素的值賦給e2,0號棧的棧頂指標向左移,1號棧的棧頂元素向右移。(左右移是針對上圖)
演算法:
status pop(dblstack &s,int e1,int e2)
e1=s.v[s.top[0]--]; //將0號棧棧頂元素的值賦值給e1,棧頂元素左移
e2=s.v[s.top[1]++]; //將1號棧棧頂元素的值賦值給e2,棧頂元素右移
return ok;
}
雙鏈表及其基本操作
單鏈表無法逆向檢索,而雙鏈表可進可退,相比較而言儲存密度更低一些 typedef struct dnodednode,dlinklist bool initdlinklist dlinklist l 判斷雙鏈表是否為空 bool isempty dlinklist l void testdlinkl...
雙棧的基本操作
雙棧 兩棧共享向量空間,將兩棧棧底設在向量兩端,初始時,左棧頂指標為 1,右棧頂為n。棧頂指標相鄰時為棧滿,兩棧頂相向增長。includeusing namespace std typedef struct node node void init node s,int n void push1 no...
資料結構之棧及其基本操作
棧的順序儲存表示 include include include using namespace std define stack int size 100 define stackincrement 10 typedef struct sqstack 構造乙個空棧 在定義了棧的基本結構後,按照設定...