考研408数据结构(持续更新中...)

顺序栈

基本概念

顺序栈是一种基于数组实现的栈结构,利用连续的内存空间存储数据,遵循"后进先出"(LIFO)原则。栈顶指针(通常为top)动态指向当前栈顶元素的位置,支持压栈(push)和弹栈(pop)操作。

核心特性

  • 存储结构:通过数组实现,需预先分配固定大小的内存空间。
  • 栈顶指针 :初始值为-1(空栈),插入元素时top递增,删除时递减。
  • 时间复杂度:压栈和弹栈操作的时间复杂度均为O(1)。
cpp 复制代码
#include <stdio.h>

// 考研标准:栈的最大容量(可根据题目修改)
#define MaxSize 50

// 顺序栈结构体定义(考研必考写法)
typedef struct {
    // 静态数组存放栈元素
    int data[MaxSize];
    // 栈顶指针:指向栈顶元素(考研最常用定义方式)
    int top;
} SqStack;

// 1. 初始化栈(核心)
void InitStack(SqStack *S) {
    // 栈顶指针置为-1,表示空栈
    S->top = -1;
}

// 2. 判断栈是否为空
int StackEmpty(SqStack S) {
    // 栈顶为-1 → 空栈,返回1;否则返回0
    return S.top == -1;
}

// 3. 判断栈是否为满
int StackFull(SqStack S) {
    // 栈顶指向最后一个元素 → 栈满,返回1
    return S.top == MaxSize - 1;
}

// 4. 入栈操作(进栈)
int Push(SqStack *S, int e) {
    // 栈满,入栈失败
    if (StackFull(*S))
        return 0;

    // 栈顶指针先+1,再赋值
    S->data[++S->top] = e;
    // 入栈成功
    return 1;
}

// 5. 出栈操作(删除栈顶元素,用e返回值)
int Pop(SqStack *S, int *e) {
    // 栈空,出栈失败
    if (StackEmpty(*S))
        return 0;

    // 先取栈顶元素,栈顶指针再-1
    *e = S->data[S->top--];
    // 出栈成功
    return 1;
}

// 6. 取栈顶元素(不删除)
int GetTop(SqStack S, int *e) {
    // 栈空,取元素失败
    if (StackEmpty(S))
        return 0;

    *e = S.data[S.top];
    // 取元素成功
    return 1;
}

// 7. 销毁栈(静态栈无需free,仅重置指针即可)
void DestroyStack(SqStack *S) {
    S->top = -1;
}

// 主函数:测试栈的所有操作(考研答题可写可不写,建议写上)
int main() {
    // 定义一个栈
    SqStack S;
    // 初始化栈
    InitStack(&S);

    // 测试入栈
    Push(&S, 10);
    Push(&S, 20);
    Push(&S, 30);
    printf("入栈元素:10,20,30\n");

    // 测试取栈顶
    int topElem;
    GetTop(S, &topElem);
    printf("当前栈顶元素:%d\n", topElem);

    // 测试出栈
    int e;
    Pop(&S, &e);
    printf("出栈元素:%d\n", e);
    GetTop(S, &topElem);
    printf("出栈后栈顶元素:%d\n", topElem);

    // 测试判空
    if (StackEmpty(S))
        printf("栈为空\n");
    else
        printf("栈不为空\n");

    // 销毁栈
    DestroyStack(&S);
    return 0;
}
相关推荐
CS创新实验室12 小时前
数据结构:程序世界的“收纳术“
数据结构
小欣加油12 小时前
leetcode2126 摧毁小行星
数据结构·c++·算法·leetcode·职场和发展
并不喜欢吃鱼13 小时前
从零开始 C++----- 十三【C++ 数据结构】哈希表从原理到手撕实现(开放定址 + 链地址全覆盖)
数据结构·c++·散列表
lDevinl13 小时前
【无标题】
数据结构·c++·青少年编程
星马梦缘1 天前
aaaaa
数据结构·c++·算法
OpenApi.cc1 天前
神经网络结构驱动+数据结构分析
数据结构·人工智能·神经网络
星恒随风1 天前
C语言数据结构排序算法详解(下):冒泡排序、快速排序、归并排序和计数排序
c语言·数据结构·笔记·学习·排序算法
初夏睡觉1 天前
数据结构学习之~二叉堆 (P3378 【模版】堆)
数据结构·c++·学习
云泽8081 天前
笔试算法 - 链表篇(一):移除、反转、合并、回文判断全解析
数据结构·c++·算法·链表
也曾看到过繁星1 天前
数据结构-复杂度
数据结构