C语言数据结构-单链表实现栈详解

        栈(Stack)是一种后进先出的数据结构,传统的数组实现栈虽然简单,但有固定大小的限制。而单链表实现栈则无需预先分配固定空间,实现按需分配,无空间浪费,所有操作都在链表头部完成,时间复杂度为O(1),本文将详细解析如何使用C语言通过单链表实现一个完整的栈结构。

        栈只需要一个指针——栈顶指针top。

一、数据结构定义

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

// 定义节点
typedef struct Node {
    int data;           // 数据域:存储栈元素
    struct Node *next;  // 指针域:指向下一个节点
} Node, *Link;          //取别名

二、关键操作详细

1. 初始化栈(initStack)

  • 返回NULL表示空栈;
  • 栈顶指针为空时,栈中没有任何元素。
// 初始化栈
Link initStack() {
    return NULL;
}

2. 判断栈空(isEmpty)

  • 如果top == NULL,返回1(真),表示栈空;
  • 否则返回0(假),表示栈非空。
// 判断栈空
int isEmpty(Link top) {
    return top == NULL;
}

3. 入栈操作(push)

        创建新节点—>设置结点数据——>新节点指向原栈顶

// 入栈
Link push(Link top, int value) {
    // 1. 创建新节点
    Link newNode = (Link)malloc(sizeof(Node));   //动态分配节点内存

    // 2. 设置节点数据
    newNode->data = value;

    // 3. 新节点指向原栈顶
    newNode->next = top; 

    // 4. 返回新栈顶
    return newNode;  
}

4. 出栈操作(pop)

  • 必须使用temp临时保存原栈顶节点;
  • free(temp)释放内存,防止内存泄漏;
  • 每个malloc必须对应一个free。
Link pop(Link top, int *value) {
    // 1. 检查栈是否为空
    if (isEmpty(top)) {
        printf("栈空\n");
        *value = -1;      // 设置错误返回值
        return top;
    }
    
    // 2. 保存当前栈顶节点(用于释放内存)
    Link temp = top;
    
    // 3. 获取栈顶数据
    *value = top->data;
    
    // 4. 栈顶指针下移
    top = top->next;
    
    // 5. 释放原栈顶节点内存
    free(temp);
    
    // 6. 返回新栈顶
    return top;
}

5. 获取栈顶元素(topValue)

// 获取栈顶
int topValue(Link top) {
    if (isEmpty(top)) {
        printf("栈空\n");
        return -1;
    }
    return top->data;
}

6. 打印栈元素(printStack)

void printStack(Link top) {
    Link p = top;        // 临时指针用于遍历
    
    while (p != NULL) {  // 遍历直到链表末尾
        printf("%d ", p->data);
        p = p->next;     // 移动到下一个节点
    }
    printf("\n");
}

7. 释放栈内存(freeStack)

Link freeStack(Link top) {
    Link p;
    
    while (top != NULL) {
        p = top;           // 保存当前节点
        top = top->next;   // 移动到下一个节点
        free(p);           // 释放当前节点
    }
    
    return NULL;  // 返回空指针
}

8. 主函数main

int main() {
    // 1. 创建空栈
    Link stack = NULL;
    
    // 2. 连续入栈测试
    stack = push(stack, 1);  // 栈:1
    stack = push(stack, 2);  // 栈:2 → 1
    stack = push(stack, 3);  // 栈:3 → 2 → 1
    
    // 3. 打印栈内容
    printf("栈内容: ");
    printStack(stack);  // 输出:3 2 1
    
    // 4. 出栈测试
    int val;
    stack = pop(stack, &val);      // 弹出3
    printf("出栈: %d\n", val);     // 输出:出栈: 3
    
    // 5. 查看当前栈顶
    printf("栈顶: %d\n", topValue(stack));  // 输出:栈顶: 2
    
    // 6. 清理栈内存
    stack = freeStack(stack);
    
    return 0;
}

三、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值