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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:36:03