我正在尝试“评估逆波兰表示法”问题。我似乎遇到了运行时错误:
第 171 行:字符 16:运行时错误:引用绑定到类型“int”的未对齐地址 0xbebebebebebec0ba,这需要 4 字节对齐 (stl_deque.h) 0xbebebebebebec0ba:注意:指针指向这里 摘要:UndefinedBehaviorSanitizer:未定义行为 /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_deque.h :180:16代码分享如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int n {static_cast<int>(tokens.size())}, x {0}, y{0};
stack<int> st;
for (int i =0; i<n; i++){
if ( (tokens[i][0] >= '0')&&(tokens[i][0] <= '9') ){
st.push(tokens[i][0] - '0');
}else{
y = st.top();
st.pop();
x = st.top();
st.pop();
switch(tokens[i][0]){
case '+':
st.push(x+y);
break;
case '-':
st.push(x-y);
break;
case '*':
st.push(x*y);
break;
case '/':
st.push(x/y);
break;
}
}
}
return st.top();
}
};
我可能正在访问一些“未对齐的地址”?这个错误消息到底是什么意思,我做错了什么?但有趣的是,我可以在在线 C++ 编译器中毫无问题地运行它:在线 C++ 编译器上的相同代码
我尝试在其他在线编译器上运行代码,它似乎没有任何麻烦。
- '0'
转换仅适用于角色。但示例输入清楚地显示非个位数的数字。像
"13" - '0'
这样的东西实际上是在进行指针算术,这意味着你的结果是一个内存地址,事情从那里开始。这是一个使用 的调整后的解决方案。我的
if
案例中检查我是否有数字的第二个表达式对于处理负数是必要的。我还选择了
std::isdigit()
而不是字符范围检查,因为这样更容易编写。该解决方案的运行时间为 3 毫秒(超过 98.77%),内存使用量为 11.91MB(超过 51.96%)。
class Solution {
public:
int evalRPN(std::vector<std::string> const & tokens) {
std::stack<int> s;
for (auto const & token : tokens) {
if (std::isdigit(token[0]) || (token.size() > 1 && std::isdigit(token[1]))) {
s.push(std::stoi(token));
} else {
int rhs = s.top();
s.pop();
int lhs = s.top();
s.pop();
if (token == "+") {
s.push(lhs + rhs);
} else if (token == "-") {
s.push(lhs - rhs);
} else if (token == "*") {
s.push(lhs * rhs);
} else {
s.push(lhs / rhs);
}
}
}
return s.top();
}
};
一些位置恰当的
cout
可以帮助您逐步查看计算运行情况。
std::cout << lhs << " " << token << " " << rhs;
if (token == "+") {
s.push(lhs + rhs);
} else if (token == "-") {
s.push(lhs - rhs);
} else if (token == "*") {
s.push(lhs * rhs);
} else {
s.push(lhs / rhs);
}
std::cout << " = " << s.top() << '\n';