栈的顺序存储会出现栈满导致上溢的情况,为了避免这种情况,可以使用栈的链式存储,简称链栈,在一个链栈中,栈底就是链表的最后一个结点,栈顶总是链表的第一个结点,一个链栈可由栈顶指针top唯一确定,采用带有头结点的单链表实现栈,top->next为栈顶元素,当top->next = 时,表示栈空
typedef struct stacknode{
//Elemtype data这里类型取int
int data;
typedef struct stacknode *next;
}slstacktype;
//初始化
void InitStack(slstacktype **top) {
*top = (slstacktype *)malloc(sizeof(slstacktype));
(*top)->next = NULL;
}
//入栈
int pushLstack(slstacktype *top, int x){
//将元素x压入链栈top中
slstacktype *p;
if ((p = (slstacktype *)malloc(sizeof(slstacktype)))==NULL){//申请一个结点
return NULL;
}
p->data = x;
p->next = top->next ;
top->next = p;
return 1;
}
//出栈
int popLstack(slstacktype *top){
slstacktype *p;
int x;
if(top->next == NULL){//空栈
return NULL;
}
p = top->next;
top->next = p->next ;
x = p->data;
free(p);
return x;
}
//取栈顶元素
int GetTop(slstacktype *top) {
if (top->next == NULL) {
return NULL;
}
else {
return (top->next->data);
}
}
主函数中测试
int main (void){
slstacktype *stack1;
int x;
InitStack(&stack1);
printf("入栈的顺序为:");
for (int i = 0; i < 10; i++) {
printf("%d ", i + 1);
pushLstack(stack1, i + 1);
}
printf("\n出栈的顺序为:");
while (stack1->next != NULL) {
x = popLstack(stack1);
printf("%d ", x);
}
return 0;
}
测试结果: