1 鏈式存儲結構
棧的鏈式存儲結構,簡稱鏈棧。
由於棧只是棧頂在做插入和刪除操作,所以棧頂應該放在單鏈表的頭部。另外,都有了棧頂在頭部了,單鏈表中的頭結點也就失去了意義,通常對於鏈棧來說,是不需要頭結點的。
對於鏈棧來說,基本不存在棧滿的情況,除非內存已經沒有使用空間了。
對於空棧來說,鏈表原來的定義是頭指針指向空,那么鏈棧的空其實就是top=NULL。
鏈棧的結構代碼如下:
typedef struct StackNode { SElemType data; Struct StackNode *next;
}StackNode;
typedef struct StackNode *LinkStackPtr; typedef struct LinkStack { LinkStackPtr top;
int count; }LinkStack;
2 進棧操作
Status push(LinkStack *S, SElemType e) { LinkStackPtr node = (LinkStackPtr)malloc(sizeof(StackNode)); node->data = e; node->next = S->top; S->top = node; S->count ++; return OK; }
3 出棧操作
Status pop(LinkStack *S, SElemType *e) { LinkStackPtr p; if (S->top == NULL) { return ERROR; } *e = S->top->data; p = S->top; S->top = S->top->next; S->count --; free(p); //釋放結點p return OK; }
4 對比順序棧和鏈棧
順序棧和鏈棧的時間復雜度都為O(1). 如果棧的使用過程中元素變化不可預期,有時會很大,有時會很小,則選擇使用鏈棧。反之,如果它的變化在可控范圍內,選擇使用順序棧比較好。