一、栈的定义
? ? ? ? 栈时限定仅在表尾进行插入或删除操作的线性表。所以称表尾为栈顶,表头称为栈底。不含元素的栈称为空栈。栈是一种后进先出的线性表。
????????????????????????????????????? ? ? ??
?
二、链栈
? ? ? ? 链栈是指采用链式存储结构实现的栈,通常链栈用单链表来表示。
?????????????????????????????????????????????????
?存储结构定义如下:
typedef struct StackNode
{
ElemType data;
stuct StackNode *next;
}StackNode, *LinkStack;
?
链栈初始化:
Status InitStackNode(LinkStack &S)
{
S=NULL; //构造一个空栈,栈顶指针置空
return OK;
}
因为一般栈的主要操作是在栈顶插入和删除,所以以单链表的头部作为栈顶是最好的,而且不需要头节点。
链栈的入栈就和单链表的头插法插入数据类似:
Status Push(LinkStack &S, SElemType e)
{
p=new StackNode; //生成新节点
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; //修改栈顶指针
delete p; //释放原栈顶元素空间
return OK;
}
|