栈的链表实现

通过带有头节点的单链表来实现栈。
我们通过在链表的表头插入来实现push,删除表顶端元素实现pop,top操作只是返回表顶端元素,空栈时只有一个头节点。

stack.h

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

typedef int ElementType;
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

Stack CreateSatck(void);
int IsEmpty(Stack S);
void DisposeStack(Stack S);		//销毁栈
void MakeEmpty(Stack S);	//创建一个空栈
void Push(Stack S,ElementType X);	//X入栈
ElementType Top(Stack S);	
void Pop(Stack S);	//出栈


#endif // STACK_H_INCLUDED

stack.c

#include"..\fatal.h"
#include"stack.h"
#include<stdio.h>
#include<stdlib.h>

struct Node{
    ElementType Element;
    PtrToNode Next;
};

int IsEmpty(Stack S){
    return S->Next == NULL;
}

Stack CreateStack(void){
    Stack S = malloc(sizeof(struct Node));
    if(S == NULL)
        FatalError("Out of Space!!");
    S->Next = NULL;

    return S;
}

void DisposeStack(Stack S){
    MakeEmpty(S);
    free(S);
}

void MakeEmpty(Stack S){
    if(S == NULL)
        Error("Must use CreatStack first");
    else
        while(!IsEmpty(S))
            Pop(S);
}

void Push(Stack S, ElementType X){
    PtrToNode TmpCell;

    TmpCell = malloc(sizeof(struct Node));
    if(TmpCell == NULL)
        FatalError("Out of space!!");
    else{
        TmpCell->Element = X;
        TmpCell->Next = S->Next;
        S->Next = TmpCell;`
    }
}

ElementType Top(Stack S){
    if(IsEmpty(S))
        Error("Empty stack");

    return S->Next->Element;
}

void Pop(Stack S){
    PtrToNode FirstCell;

    if(IsEmpty(S))
        Error("Empty Stack");
    else{
        FirstCell = S->Next;
        S->Next = FirstCell->Next;
        free(FirstCell);
    }
}
int main(){
    Stack S = CreateStack();
    //测试Push()
    Push(S,1);
    Push(S,2);
    //测试Top()
    printf("%d\n",Top(S));
    //测试Pop()
    Pop(S);
    printf("%d\n",Top(S));

    DisposeStack(S);
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值