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

使用vector实现栈遇查询Q输出最大元素提交出现段错误排查

解决栈最大元素实现中的Segmentation Fault问题

嘿,我看了你的代码,本地测试正常但提交出现段错误,问题出在两个关键的边界处理上,咱们一步步理清楚:

问题1:错误的空栈判断逻辑(A指令)

你在处理A指令时,用i==0来判断是否是第一个元素,但这个判断只在测试用例的第一个操作时有效。如果同一个测试用例里,先执行了R把栈弹空(此时top回到-1),再执行A操作,i已经不是0了,代码会进入else分支,尝试访问trackvec[top]——但此时top是-1,这属于数组越界访问,直接触发段错误。

问题2:未检查空栈就执行弹出操作(R指令)

当栈已经为空时(top == -1),执行R指令的话,你直接调用了myvec.pop_back()和trackvec.pop_back(),但空vector执行pop_back()是C++标准里的未定义行为,大概率会导致崩溃。而且之后top--会变成-2,后续如果执行Q指令,访问trackvec[top]又是越界操作。

修复后的代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    int t = 0;
    cin >> t;
    for (int x = 0; x < t; x++) {
        printf("Case %d:\n", x + 1);
        int q = 0;
        cin >> q;
        vector<int> myvec;
        vector<int> trackvec;
        int top = -1;
        for (int i = 0; i < q; i++) {
            string s;
            cin >> s;
            if (s == "A") {
                int num = 0;
                cin >> num;
                myvec.push_back(num);
                // 改成用top判断栈是否为空,而不是i==0
                if (top == -1) {
                    trackvec.push_back(num);
                    top++;
                } else {
                    if (num > trackvec[top]) {
                        trackvec.push_back(num);
                        top++;
                    } else {
                        trackvec.push_back(trackvec[top]);
                        top++;
                    }
                }
            } else if (s == "R") {
                // 弹出前先检查栈是否为空
                if (top != -1) {
                    myvec.pop_back();
                    trackvec.pop_back();
                    top--;
                }
                // 如果栈空,这里可以选择输出提示,不过题目没要求的话跳过即可
            } else if (s == "Q") {
                if (top == -1) {
                    cout << "Empty" << endl;
                } else {
                    cout << trackvec[top] << endl;
                }
            }
        }
    }
    return 0;
}

修改点说明

  • 把A指令中i==0的判断替换为top == -1,确保任何时候栈为空时,新元素都能正确初始化trackvec。
  • 在R指令执行前,先判断top != -1(即栈不为空),只有栈非空时才执行弹出操作,避免空vector的非法操作。
  • 调整了Q指令的分支逻辑,让代码更简洁易读。

这样修改后,就能处理所有边界情况(比如空栈执行R、空栈执行Q、弹空后再添加元素等),不会再出现段错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:43:57