leetcode,剑指offer 31题报错:

Line 170: Char 16: runtime error: reference binding to misaligned address 0xbebebebebebec0ba for type 'int', which requires 4 byte alignment (stl_deque.h) 0xbebebebebebec0ba: note: pointer points here <memory cannot be printed> SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_deque.h:180:16

代码:

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) 
    {
        stack<int> stk;
        int i = 1, j = 0, n = pushed.size();
        // if(n == 0)
        if(n == 0 || (n == 1 && pushed[0] == popped[0]))
        {
            return true;
        }
        stk.push(pushed[0]);
        while(i < n)
        {
            while(i<n && stk.top() != popped[j])
            {
                stk.push(pushed[i]);
                ++i;
            }
            
            while(!stk.empty() && stk.top() == popped[j])
            {
                stk.pop();
                j++;
            }
        }
        return stk.empty();

    }
};

原因:

网上查是数组越界问题,经检查程序验证:

为非法访问地址,不只是数组越界本程序报错原因为:

栈stack<int> stk;为空时访问了stk.top()。

解决办法:

stk.top()前加一个栈空判断即可,即stk.empty() && stk.top();

改正后代码:

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) 
    {
        stack<int> stk;
        int i = 1, j = 0, n = pushed.size();
        if(n == 0 || (n == 1 && pushed[0] == popped[0]))
        {
            return true;
        }
        stk.push(pushed[0]);
        while(i < n)
        {
            while(i < n && (stk.empty() || stk.top() != popped[j]))
            {
                stk.push(pushed[i]);
                ++i;
            }
            
            while(!stk.empty() && stk.top() == popped[j])
            {
                stk.pop();
                j++;
            }
        }
        return stk.empty();
    }
};

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐