纯C语言实现链栈

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode;

StackNode *InitStack(StackNode *S);//初始化
StackNode * DestroyStack(StackNode*S);//销毁
void ClearStack(StackNode*S);//清空
int StackEmpty(StackNode*S);//判空
int StackLength(StackNode*S);//栈长度
ElemType GetTop(StackNode*S);//获取栈顶元素,不修改指针位置
StackNode *Push(StackNode*S, ElemType e);//插入栈顶
StackNode *Pop(StackNode *S, ElemType *e);//删除栈顶
void StackTraverse(StackNode *S);//从栈顶依次遍历

//初始化
StackNode *InitStack(StackNode *S){
    S = NULL;
    printf("初始化成功\n");
    return S;
}

//销毁,返回空指针给S
StackNode *DestroyStack(StackNode*S){
    StackNode *p = S->next;
    while(p){
        free(S);
        S = p;
        p = p->next;
    }
    printf("销毁成功\n");
    return NULL;
}

//清空
void ClearStack(StackNode*S){
    printf("清空\n");
    StackNode *p = S;
    while(p!=NULL){
        p->data = 0;
        p = p->next;
    }
    printf("清空成功\n");
}

//判空
int StackEmpty(StackNode*S);

//栈长度
int StackLength(StackNode*S){
    int len = 0;
    StackNode *p = S;
    while(p!=NULL){
        len++;
        p = p->next;
    }
    return len;
}

//获取栈顶元素,不修改指针位置
ElemType GetTop(StackNode*S){
    if(S!=NULL){
        printf("栈顶元素为%d", S->data);
        return S->data;
    }else{
        printf("空链栈无栈顶元素\n");
        return NULL;
    }
}

//插入栈顶,返回指针指向当前栈顶
StackNode *Push(StackNode*S, ElemType e){
    StackNode *p = NULL;
    p = (StackNode *)malloc(sizeof(StackNode));
    p->data = e;
    p->next = S;
    S = p;
    printf("%d入栈成功\n", e);
    return S;
}

//删除栈顶,返回指针指向当前栈顶
StackNode *Pop(StackNode *S, ElemType *e){
    StackNode *p = NULL;//用于暂存删除元素
    if(S == NULL){
        printf("空链栈,删除失败\n");
        return NULL;
    }
    *e = S->data;
    p = S;
    S = S->next;
    free(p);
    printf("%d出栈成功\n",*e);
    return S;
}

//从栈顶依次遍历
void StackTraverse(StackNode *S){
    StackNode *p = S;
    if(p == NULL){
        printf("空链栈\n");
        return;
    }
    while(p != NULL){
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}



int main(void){
    StackNode *S;
    ElemType e;
    //初始化测试
    S = InitStack(S);

//    //获取栈顶元素测试
//    GetTop(S);
//    S = Push(S, 999);
//    GetTop(S);

    //入栈测试
    S = Push(S, 1);
    S = Push(S, 3);
    S = Push(S, 2);
    S = Push(S, 4);
    S = Push(S, 7);

    //栈长测试
    printf("栈长%d\n",StackLength(S));

    //遍历测试
    StackTraverse(S);

//    //出栈测试
//    S = Pop(S, &e);
//    S = Pop(S, &e);
//    S = Pop(S, &e);
//    //printf("测试e是否改变: %d\n",e);
//    S = Pop(S, &e);
//    StackTraverse(S);

//    //清空测试
//    ClearStack(S);
//    StackTraverse(S);

////    //销毁测试
//    S = DestroyStack(S);
//    StackTraverse(S);

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/powerzzjcode/p/10889112.html