依据**“栈满了就自动开新栈”的逻辑本质就是动态扩容 多站管理**。功能描述- 每个“站”是固定大小数组- 插入时当前站满 → 自动新建一个站- 支持多站链式管理- 纯迭代无递归无栈溢出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个站552int i;for (i 1; i 12; i) {InsertValue(manager, i);}ShowAllStations(manager);return 0;}运行效果plaintext总站数3第1站容量5当前51 2 3 4 5第2站容量5当前56 7 8 9 10第3站容量5当前211 12如果这篇文章对你有帮助别忘了点个关注我会持续分享更多开发避坑与实战干货下次更新你就能第一时间看到啦
[数据结构]栈中栈:链式级联扩容,从根源解决栈溢出
发布时间:2026/6/12 10:59:10
依据**“栈满了就自动开新栈”的逻辑本质就是动态扩容 多站管理**。功能描述- 每个“站”是固定大小数组- 插入时当前站满 → 自动新建一个站- 支持多站链式管理- 纯迭代无递归无栈溢出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个站552int i;for (i 1; i 12; i) {InsertValue(manager, i);}ShowAllStations(manager);return 0;}运行效果plaintext总站数3第1站容量5当前51 2 3 4 5第2站容量5当前56 7 8 9 10第3站容量5当前211 12如果这篇文章对你有帮助别忘了点个关注我会持续分享更多开发避坑与实战干货下次更新你就能第一时间看到啦