依据**“栈满了就自动开新栈”的逻辑,本质就是动态扩容 + 多站管理**。
功能描述:
- 每个“站”是固定大小数组
- 插入时:当前站满 → 自动新建一个站
- 支持多站链式管理
- 纯迭代,无递归,无栈溢出
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
如果这篇文章对你有帮助,别忘了点个关注,我会持续分享更多开发避坑与实战干货,下次更新你就能第一时间看到啦~