链栈的表示
链栈是运算受限的单链表,只能在链表头部进行操作。
结点类型定义如下:
typedef struct StackNode
{
SElemType data;
struct StackNode* next;
}StackNode, *LinkStack;
链栈的存储表示如下图,
链栈中的头指针S指向的是栈顶元素,在链栈中
a
i
a_i
ai结点的指针域里存放的是
a
i
−
1
a_{i-1}
ai−1的地址,这与单链表中表述的指针链的方向是相反的。
- 链表的头指针就是栈顶。
- 不要头结点。
- 基本不存在栈满的情况。
- 空栈相当于头指针指向空。
- 插入和删除仅在栈顶处执行。
链栈的实现
- 链栈的初始化
void InitStack(LinkStack &S) //构造一个空栈,栈顶指针设置为空
{
S = NULL;
return OK;
}
- 判断链栈是否为空
Status StackEmpty(LinkStack S)
{
if (S == NULL)
return TRUE;
else
return FALSE;
}
- 链栈的入栈
Status Push(LinkStack& S, SElemType e)
{
p = new StackNode; //生成一个新结点p
p->data = e; //将新结点数据域置为e
p->next = S; //将新结点插入栈顶
S = p; //修改栈顶指针为新结点p
return OK;
}
- 链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{
if (S == NULL)
return ERROR;
e = S->data; //用e存放栈顶元素的数据
p = S; //p存放栈顶元素结点
S = S->next; //头指针S往下移一位
delete p; //删除栈顶结点p
return OK;
}
- 取栈顶元素
SElemType GetTop(LinkStack S)
{
if (S != NULL)
return S->data;
}