news 2026/6/12 10:58:53

[数据结构]栈中栈:链式级联扩容,从根源解决栈溢出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[数据结构]栈中栈:链式级联扩容,从根源解决栈溢出

依据**“栈满了就自动开新栈”的逻辑,本质就是动态扩容 + 多站管理**。
功能描述:
- 每个“站”是固定大小数组
- 插入时:当前站满 → 自动新建一个站
- 支持多站链式管理
- 纯迭代,无递归,无栈溢出

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

// 每个站的容量
#define STATION_CAPACITY 5

// 定义站结构
typedef struct Station {
// 数据区(下标从1开始)
int iData[STATION_CAPACITY + 1];
// 当前站元素个数
int iCount;
// 下一个站
struct Station* pNextStation;
} Station;

// 定义总站结构(管理所有站)
typedef struct StationManager {
// 第一个站
Station* pFirstStation;
// 总站数
int iTotalStations;
} StationManager;

/**
* @brief 创建一个新站
* @return 新站指针
*/
Station* CreateNewStation(void) {
Station* pNewSta = (Station*)malloc(sizeof(Station));
if (pNewSta == NULL) {
return NULL;
}

// 初始化
pNewSta->iCount = 0;
pNewSta->pNextStation = NULL;

return pNewSta;
}

/**
* @brief 初始化总站管理
* @param pManager 总站管理器
* @return 是否成功
*/
bool InitStationManager(StationManager* pManager) {
if (pManager == NULL) {
return false;
}

// 创建第一个站
pManager->pFirstStation = CreateNewStation();
if (pManager->pFirstStation == NULL) {
return false;
}

pManager->iTotalStations = 1;
return true;
}

/**
* @brief 插入数据(站满自动开新站)
* @param pManager 总站管理器
* @param iVal 要插入的值
* @return 是否成功
*/
bool InsertValue(StationManager* pManager, int iVal) {
if (pManager == NULL) {
return false;
}

Station* pCurrSta = pManager->pFirstStation;

// 找到最后一个站
while (pCurrSta->pNextStation != NULL) {
pCurrSta = pCurrSta->pNextStation;
}

// 判断当前站是否已满
if (pCurrSta->iCount >= STATION_CAPACITY) {
// 站满 → 新建站(战中战)
Station* pNewSta = CreateNewStation();
if (pNewSta == NULL) {
return false;
}

// 挂到最后
pCurrSta->pNextStation = pNewSta;
pManager->iTotalStations++;

// 切换到新站
pCurrSta = pNewSta;
}

// 插入数据(下标从1开始)
pCurrSta->iCount++;
pCurrSta->iData[pCurrSta->iCount] = iVal;

return true;
}

/**
* @brief 打印所有站内容
* @param pManager 总站管理器
*/
void ShowAllStations(StationManager* pManager) {
if (pManager == NULL) {
return;
}

Station* pCurrSta = pManager->pFirstStation;
int iStaIndex = 1;

printf("总站数:%d\n", pManager->iTotalStations);

while (pCurrSta != NULL) {
printf("第%d站(容量%d,当前%d):", iStaIndex, STATION_CAPACITY, pCurrSta->iCount);

int i;
for (i = 1; i <= pCurrSta->iCount; i++) {
printf("%d ", pCurrSta->iData[i]);
}
printf("\n");

pCurrSta = pCurrSta->pNextStation;
iStaIndex++;
}
}

// 测试
int main(void) {
StationManager manager;
bool bInitOk = InitStationManager(&manager);
if (!bInitOk) {
return -1;
}

// 插入12个数据 → 自动开3个站(5+5+2)
int i;
for (i = 1; i <= 12; i++) {
InsertValue(&manager, i);
}

ShowAllStations(&manager);

return 0;
}


运行效果:
plaintext
总站数:3
第1站(容量5,当前5):1 2 3 4 5
第2站(容量5,当前5):6 7 8 9 10
第3站(容量5,当前2):11 12

如果这篇文章对你有帮助,别忘了点个关注,我会持续分享更多开发避坑与实战干货,下次更新你就能第一时间看到啦~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 10:51:51

HNSW 剪枝优化:从贪婪连接到启发式邻居选择的核心剖析

HNSW 剪枝优化:从贪婪连接到启发式邻居选择的核心剖析 引言 分层可导航小世界(Hierarchical Navigable Small World,HNSW)算法是当前最有效的大规模近似最近邻搜索(ANN)索引之一。然而,在原始 HNSW 的构建阶段,每个新插入点的邻居选择采用的是简单的 贪婪连接(greed…

作者头像 李华
网站建设 2026/6/12 10:50:53

渐进分析与拉普拉斯-贝尔特拉米算子在多视图数据中的应用

1. 渐进分析与拉普拉斯-贝尔特拉米算子的偏差分析渐进分析是研究算法或数学表达式在输入规模趋向于无穷大时的行为特性的数学方法。在机器学习和数据科学领域&#xff0c;渐进分析帮助我们理解算法在数据量增大时的收敛性和计算效率。拉普拉斯-贝尔特拉米算子则是微分几何中的核…

作者头像 李华
网站建设 2026/6/12 10:40:57

2026视频人声转文字保姆级教程:电脑/在线/手机多类工具手把手教学

视频里的人声想要转换成文字&#xff0c;还在手动逐句敲打&#xff1f;不管是整理课程笔记、提取视频字幕&#xff0c;还是梳理会议访谈内容&#xff0c;纯手动录入不仅耗费大量时间&#xff0c;还容易出现错字、漏字问题。不少朋友都在找合适的工具&#xff0c;有的想要电脑端…

作者头像 李华
网站建设 2026/6/12 10:40:04

【花雕学编程】Arduino BLDC 之群体机器人紧急疏散算法

在基于Arduino与BLDC&#xff08;无刷直流电机&#xff09;的移动机器人系统中&#xff0c;群体机器人紧急疏散算法是应对突发灾难、保障人员安全的关键技术。该算法旨在通过多智能体协同&#xff0c;在动态、未知的危险环境中快速规划出安全、高效的撤离路径&#xff0c;并引导…

作者头像 李华