顺序栈的实现依靠数组,而数组需要事先声明长度,一次性地静态地分配内存空间。这样就给我们带来很多不便。因为我们事先并不能精确地估计栈所需的大小,估计大了浪费空间,估计小了后果就严重了,导致程序无法正常运行。所以我们通常使用链栈这种数据结构。
链栈用链表作为存储结构,栈初始化时仅需给栈顶指针分配内存空间,而后每当有数据入栈时再为该数据分配空间,这样实现了内存空间的动态分配。理论上栈的大小可以是无限大的(小心撑爆你的内存 o(∩_∩)o)。不存在顺序栈的诸多问题。
程序实现:依次把0~99压栈,再依次出栈并打印。
程序清单:LinkStack.h LinkStackTest.c
LinkStack.h
/**/
/* LinkStack.h */
#include < stdlib.h >
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef int ElementType;
typedef struct node ... {
ElementType data;
struct node *next;
} StackNode, * LinkStack;
void InitStack(LinkStack top) ... {
top->next = NULL;
}
int IsEmpty(LinkStack top) ... {
if(top->next == NULL) return TRUE;
return FALSE;
}
int Push(LinkStack top, ElementType element) ... {
StackNode *temp;
temp = (StackNode *)malloc(sizeof(StackNode));
if(temp == NULL) return FALSE;
temp->data = element;
temp->next = top->next;
top->next = temp;
return TRUE;
}
int Pop(LinkStack top, ElementType * element) ... {
if(IsEmpty(top)) return FALSE;
StackNode *temp = top->next;
*element = temp->data;
top->next = temp->next;
free(temp);
return TRUE;
}
void GetTop(LinkStack top, ElementType * element) ... {
*element = top->next->data;
}
#include < stdlib.h >
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef int ElementType;
typedef struct node ... {
ElementType data;
struct node *next;
} StackNode, * LinkStack;
void InitStack(LinkStack top) ... {
top->next = NULL;
}
int IsEmpty(LinkStack top) ... {
if(top->next == NULL) return TRUE;
return FALSE;
}
int Push(LinkStack top, ElementType element) ... {
StackNode *temp;
temp = (StackNode *)malloc(sizeof(StackNode));
if(temp == NULL) return FALSE;
temp->data = element;
temp->next = top->next;
top->next = temp;
return TRUE;
}
int Pop(LinkStack top, ElementType * element) ... {
if(IsEmpty(top)) return FALSE;
StackNode *temp = top->next;
*element = temp->data;
top->next = temp->next;
free(temp);
return TRUE;
}
void GetTop(LinkStack top, ElementType * element) ... {
*element = top->next->data;
}
LinkStackTest.c
/**/
/* LinkStackTest.c */
#include < stdio.h >
#include " LinkStack.h "
void main() ... {
LinkStack s;
s = (LinkStack)malloc(sizeof(StackNode));
InitStack(s);
for(int i=0; i<100; i++)
Push(s,i);
int rslt;
while (!IsEmpty(s)) ...{
Pop(s,&rslt);
printf("%d ",rslt);
}
}
#include < stdio.h >
#include " LinkStack.h "
void main() ... {
LinkStack s;
s = (LinkStack)malloc(sizeof(StackNode));
InitStack(s);
for(int i=0; i<100; i++)
Push(s,i);
int rslt;
while (!IsEmpty(s)) ...{
Pop(s,&rslt);
printf("%d ",rslt);
}
}