快速入门数据结构--栈

一、栈

一、什么是栈?

栈(Stack) 是一种只能在一端进行插入和删除操作的线性数据结构。这一端被称为栈顶(Top) ,另一端固定不动,称为栈底(Bottom)

这里大家把它认为是一个水桶就行,记住一个特点:后进先出

二、栈的基本操作

操作 作用
push() 将一个元素压入栈顶
pop() 将栈顶元素弹出并返回
peek()top() 查看栈顶元素但不移除它
isEmpty() 判断栈是否为空
isFull() 判断栈是否已满(适用于数组实现)
size() 返回栈中元素的数量

三、栈的实现方式

  1. 使用数组实现(静态栈)

定义结构体,顺序表这部分都懂

cs 复制代码
#define MAX_SIZE 100 // 最大容量

typedef struct {
    int arr[MAX_SIZE]; // 存储栈的数组
    int top;           // 栈顶指针(初始为 -1)
} Stack;

初始化栈

cs 复制代码
void initStack(Stack *s) {
    s->top = -1;//因为数组默认下标是0,空栈的下标设置为-1
}

压栈 push

cs 复制代码
void push(Stack *s, int value) {
    if (!isFull(s)) {
        s->arr[++(s->top)] = value;//栈顶指针向上移动
    } else {
        printf("Stack overflow\n");
    }
}

弹栈 pop

cs 复制代码
int pop(Stack *s) {
    if (!isEmpty(s)) {
        return s->arr[(s->top)--];//根压栈相反,取出来那栈顶指针就下移
    } else {
        printf("Stack underflow\n");
        return -1;
    }
}

查看栈顶 peek

cs 复制代码
int peek(Stack *s) {
    if (!isEmpty(s)) {
        return s->arr[s->top];
    } else {
        printf("Stack is empty\n");
        return -1;
    }
}

2. 使用链表实现(动态栈)

把它当成单链表就行,只不过多了个指向最后一个节点的top指针

代码演示一下吧 :

定义节点结构

cs 复制代码
typedef struct Node {
    int data;
    struct Node* next;
} Node;

定义栈结构

cs 复制代码
typedef struct {
    Node* top; // 栈顶指针
} Stack;

初始化栈

cs 复制代码
void initStack(Stack *s) {
    s->top = NULL;
}

判断栈空

cs 复制代码
int isEmpty(Stack *s) {
    return s->top == NULL;
}

压栈 push

cs 复制代码
void push(Stack *s, int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        printf("Memory allocation failed\n");
        return;
    }

    newNode->data = value;
    newNode->next = s->top;
    s->top = newNode;
}

弹栈 pop

cs 复制代码
int pop(Stack *s) {
    if (!isEmpty(s)) {
        Node* temp = s->top;
        int value = temp->data;
        s->top = s->top->next;
        free(temp);
        return value;
    } else {
        printf("Stack underflow\n");
        return -1;
    }
}

查看栈顶 peek

cs 复制代码
int peek(Stack *s) {
    if (!isEmpty(s)) {
        return s->top->data;
    } else {
        printf("Stack is empty\n");
        return -1;
    }
}

下期明天更,睡觉了宝子们!

相关推荐
GreenTea2 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Bode_20022 小时前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
土司大王3 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹4 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王4 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
罗西的思考5 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
小哈里6 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
小π军7 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司7 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
a187927218318 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解