(省略午饭)
"窗外还是...(省略)",我自言自语到。
"下来是...",我翻开了书继续看起来:
链栈是以单链表作为栈的存储结构,单链表的第一个结点作为栈顶,最后一个结点作为栈底。链栈既可以是带头结点的链表也可以是不带头结点的链表。
注意:栈通常由栈顶指针top进行标识,若无头结点的链栈,栈顶指针直接指向栈顶结点;对于由头结点的链栈,栈顶指针指向头结点。表示如下:
typedef struct node{
Elemtype data;//数据域
struct node *next;//指针域
}StackNode,*LinkStack;
//图示后加1.16
链栈就是一个限定只能在表头进行push,pop操作的链表,基本操作无异与链表。
以下为带头结点的链表的部分:
获取栈顶元素
int GetTop(LinkStack top){
if(!top)return 0;//无效判定
if(!top->next)return 0;//栈空
cout<<top->next->data;//取得
}
实质为获取链表第一个结点(由栈顶指针的next域表示)的数据元素。
元素入栈
和顺序栈不同的是,在链表中将e入栈,并不需要判断是否已满,只需要生成一个包含元素e的新结点,并将新结点插入到链表的第一个位置(即栈顶)即可
int pushStack(LinkStack top,Elemtype e){
StackNode *s;
if(!top)return 0;//链栈无效
s=(StackNode*)malloc(sizeof(StackNode));
if(!s)return 0;//内存分配错误
s->data=e;//将数据放到新结点的数据域
s->next=top->next;//将s插入到栈顶
top->next=s;
return 1;
}
元素出栈
首先是判断栈空,在不为空的前提下进行出栈:
int popStack(LinkStack top){
StackNode *s;
if(!top)return 0;//链栈无效
if(!top->next)return 0;//栈空
cout<<top->next->data<<endl;
s=top->next;//s指向栈顶结点
top->next=s->next;//删除栈顶结点
free(s);//释放
return 1;
}
对于其应用,将在后续示出...to be continue...
//1.16