数据结构之栈(3)——链栈
前面经说过,根据存储结构的不同,将栈分为顺序栈和链栈
链栈按照链式存储结构存储
链栈原理和理解
由于栈的删除和插入操作仅限制在表头进行,所以链表的表头指针(指向头结点)就作为栈顶指针(便于方便直接使用带头结点的链表)
因此,若top(表头指针,栈顶指针)->next=NULL,则链栈为空
整个理解过程可理解为头插法
链栈的定义
typedef char ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LinkStackNode,*LinkStack;
LinkStack表示栈顶指针(指向头结点),LinkStackNode表示栈的每个节点,每个节点的data域表示数据元素,next域指向下一个节点
链栈的初始化:
//链栈的初始化
void Init(LinkStack top)
{
top->next=NULL;
}
头结点下一个为空
链栈的入栈操作:不需要担心是否发生上溢
//入栈操作
bool PushStack(LinkStack top,ElemType x)
{
LinkStackNode *temp;
temp=(LinkStackNode*)malloc(sizeof(LinkStackNode));
if(temp==NULL)
return false;
else
{
temp->data=x;
temp->next=top->next;
top->next=temp;
free(temp);
return true;
}
}
由于采用了链式存储的方式,不需要担心是否上溢,注意temp要申请内存空间,并且不能释放!!!!!
链表的出栈操作
//出栈操作
bool PopStack(LinkStack top,ElemType* e)
{
LinkStackNode* temp;
temp=top->next;
if(temp==NULL)
return false;
else
{
*e=temp->data;
top->next=temp->next;
free(temp);
return true;
}
}
注意判断是否为空,并且注意不要重复申请内存空间,并记得释放内存(temp)
亲爱的听众朋友我是你的代班DJ

浙公网安备 33010602011771号