C++实现退格字符串比较用栈处理测试用例出现运行时错误如何解决
错误原因排查
核心问题点
- 空栈非法访问:你在比较两个栈内容时,只判断了
st1非空就进入循环,没有校验st2的状态。当两个字符串退格处理后长度不一致时,会出现st2已经为空但还在调用st2.top()、st2.pop()的情况,这属于未定义行为,就是你遇到的对齐报错的直接诱因。你给出的测试用例刚好符合这个场景:"bxj##tw"退格后长度为3,"bxj###tw"退格后长度为2,循环到第二轮时st2已经为空,触发非法内存访问。 - 返回值逻辑与类型错误:你判断两个栈都为空时返回
"",函数返回值类型为bool,这里写法不规范,虽然会触发隐式转换,但逻辑上两个空栈处理结果相等,应该直接返回true。 - 栈类型冗余:你用
stack<int>存储字符,虽然不影响运行,但用stack<char>更匹配存储的内容,避免不必要的类型转换隐患。
修复方案
首先在比较栈内容前先判断两个栈的大小是否相等,不等直接返回false;修正空栈的返回逻辑;同时可以简化入栈出栈的判断逻辑,降低出错概率。
修复后的代码如下:
class Solution { public: bool backspaceCompare(string s, string t) { stack<char> st1; stack<char> st2; for(int i=0; i<s.size(); i++){ if(s[i] != '#'){ st1.push(s[i]); } else if(!st1.empty()){ st1.pop(); } } for(int i=0; i < t.size(); i++){ if(t[i] != '#'){ st2.push(t[i]); } else if(!st2.empty()){ st2.pop(); } } if(st1.size() != st2.size()){ return false; } while(!st1.empty()){ if(st1.top() != st2.top()){ return false; } st1.pop(); st2.pop(); } return true; } };
内容的提问来源于stack exchange,提问作者Md Talha
相关产品推荐
相关产品推荐

