資料結構 棧 順序棧 雙棧共享同一棧空間 鏈式棧

2021-08-08 03:23:39 字數 3016 閱讀 3559

1 //棧,先進後出、後進先出特性

2 3

4 //順序棧的靜態儲存結構需要預先定義或申請棧的儲存空間,棧空間容量有限,一旦裝滿不能擴充,元素進棧會發生上溢現象

5 #define maxsize 100 //棧元素資料型別

6 typedef int selemtype;

7 typedef struct

8 seqstack;

12 13 //順序棧的動態儲存結構

14 #define initsize 100 //棧空間初始大小

15 typedef int selemtype;//棧元素資料型別

16 typedef struct//順序棧的結構定義

17 seqstack;

21 //動態順序棧初始化

22 void initstack(seqstack& s)

23 26 s.maxsize = initsize;

27 s.top = -1;//棧空情形,因為向量下標從0開始,棧空時應該s.top < 0,因此空棧時棧頂指標s.top == -1

28 }

29 30 //動態順序棧進棧操作的實現

31 void push(seqstack& s, selemtype x)

32

37 //動態順序棧溢位處理,擴充棧的記憶體空間

38 void overflowprocess(seqstack s)

39 42 for(int i=0; i<=s.top; i++)

43 newarray[i] = s.elem[i];

44 s.maxsize = 2*s.maxsize;//按2*s.maxsize大小申請新的連續儲存空間,

45 delete s.elem;//把原來儲存空間中存的所有棧元素轉移到新的儲存空間後釋放原來的儲存空間

46 s.elem = newarray;//讓s.elem指向新的儲存空間

47 }

48 //順序棧退棧操作的實現 先取出棧頂指標所指示棧頂的元素,再讓棧頂指標減1,

49 int pop(seqstack& s, selemtype& x)

50 56 //讀取棧頂元素的值

57 int gettop(seqstack& s, selemtype& x)

58 64 //判空,函式測試棧s空否。若棧空,則函式返回1,否則函式返回0

65 int stackempty(seqstack& s)

66 69 //判棧是否滿

70 int stackfull(seqstack& s)

71

74 //判斷棧的長度

75 int stacksize(seqstack& s)

76

雙棧共享同一棧空間

81 //當程式同時使用兩個棧時,定義乙個足夠大的棧空間vector[maxsize],並將兩個棧設為0號棧和1號棧。該空間的兩端分別設為兩個站得棧底,

82 //用b[0](=-1)和b[1](=maxsize)指示。

83 //進棧情形:對於0號棧,每次進棧時棧頂指標t[0]加1;對於1號棧,每次進棧時棧頂指標t[1]減1。當兩個棧的棧頂指標相遇,

84 //即t[0] + 1 == t[1]才算棧滿

85 //退棧情形:對於0號棧,每次退棧時棧頂指標t[0]減1;對於1號棧,每次退棧時棧頂指標t[1]加1.只有當棧頂指標退到棧底才算棧空。

86 //兩棧的大小可變。

87 88 //兩棧共享同一棧空間時的進棧操作

89 int push(dualstack& ds, selemtype x, int d)

90 100 //兩棧共享同一空間時的退棧操作

101 int pop(dualstack& ds, selemtype& x, int d)

102

鏈式棧

116 //鏈式棧

117 //採用鏈式棧來表示乙個棧,便於結點的插入和刪除,在程式中同時使用多個棧的情況下,用鏈結表示不僅能提高速率,還可以達到共享儲存

118 //空間的目的。鏈式棧的棧頂指標在棧表頭結點,但實際的棧頂結點在頭結點後面的首元結點。因此,新結點的插入和棧頂結點的刪除都在鍊錶

119 //的首元結點使用了乙個鍊錶的頭指標來表示乙個棧。對於同時使用多個棧的情形,只要宣告乙個鍊錶指標向量,就能同時定義和使用多個

120 //鏈式棧,並且無需在運算時做儲存空間的移動。

121

122 //鏈式棧的定義

123 typedef int selemtype;

124 typedef struct node

125 linknode, *linkstack ;

129

130 void initstack(linkstack& s)

131

134 s->link = null;//棧頂置空

135 }

136 void push(linkstack& s, selemtype x)

137

140 p->data = x;

141 p->link = s->link;//新結點插入在煉表頭

142 s->link = p;

143 }

144 int pop(linkstack& s, selemtype& x)

145

154 int gettop(linkstack& s, selemtype& x)

155

160 int stackempty(linkstack& s)

161

164 int stacksize(linksize& s)

165

173 return k;

174 }

資料結構 棧部分 雙棧共享空間

include using namespace std const int max cont 100 enum stacktype template class datatype class sqdoublestack sqdoublestack const datatype a1,int num1...

棧 棧 鏈式棧,順序棧,共享棧

棧也是一種線性表結構,只不過棧的操作是受限的,它的特點就是在棧頂方向新增新的元素,且刪除元素也只能從棧頂方向刪除。因此棧是一種lifo 後進先出 特性的資料結構。壓棧 新的元素放入棧的操作。出棧 從棧中移除乙個元素的操作。因為棧是一種線性結構,所以可以通過前面所學的鍊錶和順序表作為內部實現。我們可以...

資料結構 棧 順序棧和鏈棧

順序棧 基於陣列的順序棧 include include include typedef enum status status typedef int elemtype typedef struct sqstack sqstack 函式宣告 基於陣列的順序棧 status initstack sqs...