对于链栈来说,由于栈顶放在链表的头部,所以对于链栈来说是不需要头节点的。
对于链栈来说,基本上不存在栈满的情况,除非内存已经没有可以使用的空间。对于空栈来说t->top=NULL;也就是相当于头指针指向空。
它的结构如下:
#ifndef _linkstack_h
#define _linkstack_h
#include<iostream>
#include<stdlib.h>
typedef struct stacknode//栈中的结点
{
struct stacknode* next;
int data;
}stacknode;
typedef struct linkstack
{
stacknode* top;//栈顶指针
int length;//用来记录栈中结点个数
}linkstack;
extern void initlinkstack(linkstack* s);
extern int pushlinkstack(linkstack* s, int value);
extern int poplinkstack(linkstack* s, int value);
extern void clearlinkstack(linkstack* s);
extern void printlinkstack(linkstack* s);
extern void destroylinkstack(linkstack* s);
#endif
#include"linkstack.h"
void initlinkstack(linkstack* s)//空栈初始化
{
s->length = 0;
s->top = NULL;
}
int pushlinkstack(linkstack* s,int value)//进栈不用判断栈为满的情况
{
stacknode* l = NULL;
l = (stacknode*)malloc(sizeof(stacknode));//栈的结点
l->data = value;
l->next = s->top;//把当前的栈顶指针地址赋给新结点的指针域
s->top = l;//栈顶指针指向新的结点
s->length++;//栈的结点个数加一
return value;
}
int poplinkstack(linkstack* s, int value)//出栈
{
stacknode* l = NULL;
if (s->top == NULL||s->length==0)//栈里没有元素
{
return 0;
}
l = s->top;
s->top = s->top->next;
value = s->top->data;
free(l);
s->length--;
return value;
}
void clearlinkstack(linkstack* s)//清空栈
{
stacknode* p = NULL;
p = s->top;
while (p)
{
p = p->next; //p = s->top->next;
free(p);
}
return;
}
void destroylinkstack(linkstack* s)//销毁栈
{
clearlinkstack(s);//先清空栈内元素
free(s);//再释放栈顶指针
s = NULL;
}
void printlinkstack(linkstack* s)//遍历栈
{
int i = 0;
while (s->top)
{
printf("%d\t", s->top->data);//从第一个结点开始遍历
s->top = s->top->next;
i++;
if (i == 8)
{
printf("\n");
i = 0;
}
}
printf("\n");
return;
}
#include"linkstack.h"
int main(void)
{
int i = 0;
linkstack* s = NULL;
s = (linkstack*)malloc(sizeof(linkstack));
initlinkstack(s);
for (i = 1; i <= 48; i++)
{
pushlinkstack(s,i);
}
printlinkstack(s);
system("pause");
return 0;
}
链栈的进栈和出栈都没有人和循环操作,时间复杂度为O(1),对比顺序栈和链栈,顺序栈要事先确定一个固定的长度,可能会存在内存空间浪费的问题,但它的优势是存取时定位很方便,而链栈则要求每个元素都要有指针域,这同时也增加了一些内存开销,但对于栈的长度无限制。如果栈的使用过程中元素不可预料,有时大有时小,那么最好用链栈,如果它的变化在可控范围内,建议使用顺序栈会更好一些。