无法找出我的代码中的错误

问题描述 投票:0回答:1

我正在尝试“评估逆波兰表示法”问题。我似乎遇到了运行时错误:

第 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++ 编译器上的相同代码

请帮我找出缺少的内容。

我尝试在其他在线编译器上运行代码,它似乎没有任何麻烦。

c++ stack
1个回答
1
投票
- '0'

转换仅适用于角色。但示例输入清楚地显示非个位数的数字。像

"13" - '0'
这样的东西实际上是在进行指针算术,这意味着你的结果是一个内存地址,事情从那里开始。
这是一个使用 

std::stoi()

 的调整后的解决方案。
我的

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';

© www.soinside.com 2019 - 2024. All rights reserved.