1.1链栈
栈的链接存储结构称为链栈,用单链表来表示,类型定义如下:
typedef struct node
{
datatype data;
struct node*next;
}StackNode;//链栈结点类型
typedef struct
{
StackNode*Top;//指向栈顶结点的指针
}LinkStack;
1.2链栈的基本运算
1.2.1栈初始化
建立空链栈
void InitStack(LinkStack*&S)
{
S=(LinkStack*)malloc(sizeof(LinkStack));
S->Top=NULL;
}
1.2.2入栈
void Push(LinkStack*S, datatype x)
{
StackNode*p=(StackNode*)malloc(sizeof(StackNode));
p->data=x;
p->next=S->Top;//将新节点插入到栈顶
S->Top=p;//更新结点信息
}
1.2.3出栈
int Pop(LinkStack*S, datatype&x)
{
StackNode*P=S->Top;
if(S->Top=-1)
{
printf("栈下溢");
return 0;
}
else
{
x=p->data;
S->Top=p->next;
free(p);
return 1;
}
}
1.2.4取栈顶元素
int GetTop(LinkStack*S, datatype&x)
{
StackNode*P=S->Top;
if(S->Top=-1)
{
printf("栈下溢");
return 0;
}
else
{
x=p->data;
return 1;
}
}
1.3顺序栈与链栈的比较
二者的基本运算的时间复杂度均为O(1),空间特性上,顺序栈需要一个固定长度作为栈的初始容量,可能存在存储元素个数限制和空间的浪费问题,但是链栈不存在,链栈的每个元素需要一个结构域,产生了结构性开销,故当使用过程中元素个数变化较大时使用链栈,反之用顺序栈。