链栈的操作

例1:完成Stack CreateStack(void)函数,该函数创建一个栈(空栈,带头结点),并返回栈指针。

Stack CreateStack()
{
Stack S; //定义一个栈指针
Node *p; //申请一个新节点
p=(Node*)malloc(sizeof(Node));
    p->next=S;
    S=p;
return S;
}

例2:完成void MakeEmpty(Stack S);函数,该函数把链栈置空(释放数据结点空间,但不释放头结点),已知S是带头结点的链栈。

void MakeEmpty(Stack S)
{
Stack p,q; //p为指向型指针,q为实际要释放的指针
p=S->next;
while(p)
{ //一个个注意释放节点。

q=p;
p=p->next;
free(q);
}
S->next=NULL;
}

例3:完成Stack DisposeStack(Stack S)函数,该函数销毁链栈S,已知S是带头结点的链栈。

Stack DisposeStack(Stack S)
{
Stack s;
while(S)
{
s=S->next;
free(s);
S=s;

return NULL;
}

例4:链栈的判空只要S->next==NULL则代表栈空。

例5:完成void Push(Stack S,ElemType x)函数,该函数把数据x进栈,已知S是带头结点的链栈。

void Push(Stack S,ElemType x)
{
Node *p;
p=(Node*)malloc(sizeof(Node));
if(p==NULL) //申请节点失败。
{
return ;
}
p->data=x;
p->next=S->next;
S->next=p;
}

例6:成void Pop(Stack S)函数,该函数把链栈S栈顶元素出栈,如果S已空,则什么都不做。已知S是带头结点的链栈。

void Pop(Stack S)
{
Node *p;
p=S->next;
if(p==NULL)
{
return; //考虑是一个空栈。
}
S->next=p->next;
free(p);
}

例7:完成ElemType Top(Stack S)函数,该函数返回链栈S的栈顶数据,已知S是带头结点的链栈并且S非空

ElemType Top(Stack S)
{
return S->next->data;
}

例8:完成ElemType TopAndPop(Stack S)函数,该函数把返回链栈S栈顶数据并把栈顶数据出栈,已知S是带头结点非空链栈。

ElemType TopAndPop(Stack S)
{
ElemType x;
x=S->next->data;
    Stack p;
    p=S->next;
    S->next=p->next;
    free(p);
    return x;
}

你可能感兴趣的:(链栈的操作)