You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++栈存储学生信息如何实现按分数展示Top3学生功能

问题修复方案

核心问题原因

  • 你编写的shortStack冒泡排序仅完成了分数大小判断,缺少相邻学生数据交换的逻辑
  • top方法中调用shortStack的代码被注释,执行选项4时不会触发排序逻辑
  • 缺少学生总数不足3人的边界判断,极端情况会触发空指针访问崩溃

修复代码

1. 完善shortStack排序逻辑

这里选择直接交换相邻节点存储的学生数据,相比修改链表指针更易理解:

void shortStack( )
{
    // 边界判断:节点数小于2无需排序
    if (sizeOfStack < 2) return;
    for ( std::size_t i = 0; i < sizeOfStack; ++i )
    {
        Student* ptr = headStudent;
        // 冒泡排序优化:已排序的末尾部分无需重复判断
        for ( std::size_t j = 0; j < sizeOfStack - 1 - i; ++j )
        {
            if ( ptr->getMarks( ) < ptr->getNextStudent( )->getMarks( ) )
            {
                // 交换姓名
                string tempName = ptr->getName();
                ptr->setName(ptr->getNextStudent()->getName());
                ptr->getNextStudent()->setName(tempName);
                // 交换分数
                int tempMark = ptr->getMarks();
                ptr->setMarks(ptr->getNextStudent()->getMarks());
                ptr->getNextStudent()->setMarks(tempMark);
            }
            ptr = ptr->getNextStudent( );
        }
    }
}

2. 修复top方法

打开排序调用,添加边界判断避免越界:

void top( )
{
    if ( !isEmpty( ) )
    {
        // 启用排序逻辑
        shortStack();
        cout << "\n\n" << "Top Positions:" << '\n';
        cout << '\n' << "Name\t\tMarks";
        Student* ptr = headStudent;
        // 取3和总人数的最小值,避免学生不足3人时访问空指针
        std::size_t showCount = min(static_cast<std::size_t>(3), sizeOfStack);
        for( std::size_t idx = 0; idx < showCount; ++idx )
        {
            cout << '\n' << ptr->getName( ) << "\t\t" << ptr->getMarks( );
            ptr = ptr->getNextStudent( );
        }
        cout << "\n\n";
    }
}

额外说明

你当前实现的栈是链表尾插尾删的结构,符合栈后进先出的特性,排序逻辑仅调整存储顺序满足取高分的需求,不会破坏栈的基础功能。

内容的提问来源于stack exchange,提问作者luziamas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:01