欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

链栈C语言实现 --- 数据结构之栈的链式存储

程序员文章站 2022-06-05 14:56:49
...
#include<stdio.h>
#include<stdlib.h>

// 链表中的结点结构 
typedef struct Node {
    int data;  // 数据元素 
    struct Node *next; // 指向下一个结点 
} StackNode, *PStackNode;

typedef struct {
    PStackNode top; // 指向栈顶结点 
    int count; //  栈的大小 
} LinkStack, *PLinkStack;

// 初始化链栈,栈顶指针置为NULL,栈的大小置为0 
PLinkStack Init_LinkStack() {
    PLinkStack S;

    S = (PLinkStack)malloc(sizeof(LinkStack));
    if (!S) {
        return NULL;
    }
    S->top = NULL;
    S->count = 0;

    return S;
}

// 判断栈是否为空 
int Empty_LinkStack(PLinkStack S) {
    return (S->top == NULL);
}

// 入栈,参数e为入栈的元素 
void Push_LinkStack(PLinkStack S, int e) {
    PStackNode p;

    p = (PStackNode)malloc(sizeof(StackNode)); // 创建新的结点 
    if (!p) {
        return;
    }
    p->data = e; // 赋值元素e 
    p->next = S->top; // 新的结点next指向栈顶结点 
    S->top = p; // 更新栈顶结点为新的结点 
    S->count++; // 栈的大小加一 
}

// 出栈,出栈的元素存放在参数e中 
int Pop_LinkStack(PLinkStack S, int *e) {
    PStackNode p;
	
    if (Empty_LinkStack(S)) { // 判断栈是否为空 
        printf("Stack NULL!\n");
        return 0;
    }
    *e = S->top->data; // 将栈顶元素赋值给参数e 
    p = S->top; // 临时存储久的栈顶结点 
    S->top = S->top->next; // 将栈顶结点更新为久的栈顶结点的下一个结点 
    free(p); // 释放久的栈顶结点 
    S->count--; // 栈的大小减一 

    return 1;
}

// 获取栈顶的元素,存放在参数e中 
int GetTop_LinkStack(PLinkStack S, int *e) {
    if (Empty_LinkStack(S)) {
        printf("Stack NULL!\n");
        return 0;
    }
    *e = S->top->data;

    return 1;
}

// 遍历打印栈的所有元素 
void Print_LinkStack(PLinkStack S) {
    PStackNode p;

    if (Empty_LinkStack(S)) {
        printf("Stack NULL!\n");
        return;
    }
    p = S->top;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

// 清空栈 
void Clear_LinkStack(PLinkStack S) {
    if (Empty_LinkStack(S)) {
        return;
    }
    while (S->count) {
        PStackNode p = S->top;
        S->top = p->next;
        free(p);
        S->count--;
    }
}

// 返回栈的大小 
int Length_LinkStack(PLinkStack S) {
    if (!S) {
        return 0;
    }
    return S->count;
}

int main() {
    PLinkStack S;
    int n, e, i;

    printf("input the number of datas :\n");
    scanf("%d", &n);

    S = Init_LinkStack();
    printf("input datas :\n");

    for (i = 0; i < n; i++) {
        scanf("%d", &e);
        Push_LinkStack(S, e);
    }
    printf("The Stack is :\n");
    Print_LinkStack(S);

    Pop_LinkStack(S, &e);
    printf("The pop data is %d.\n", e);

    GetTop_LinkStack(S, &e);
    printf("The top data is %d.\n", e);

    printf("The new stack is :\n");
    Print_LinkStack(S);

    printf("The length of stack is %d.\n", Length_LinkStack(S));

    printf("Clear the stack :\n");
    Clear_LinkStack(S);
    Print_LinkStack(S);

    printf("The new stack length is %d.\n", Length_LinkStack(S));

    return 0;
}

链栈C语言实现 --- 数据结构之栈的链式存储