欢迎光临
我们一直在努力

[数据结构]栈中栈_解决栈溢出

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

 

赞(0)
未经允许不得转载:171主机测评 » [数据结构]栈中栈_解决栈溢出
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址