使用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
相关产品推荐
相关产品推荐

