C++ STL栈pop()返回void无法赋值给char变量的解决方案咨询
解决栈验证括号时的赋值错误问题
嘿,我一眼就看到你卡在哪啦!你遇到的这个错误和malloc完全没关系,问题出在C++标准库stack的pop()方法的特性上——它只负责移除栈顶元素,不会返回这个元素的值,所以你没法直接把pop()的结果赋值给open_ch变量。
错误原因拆解
你写的这行代码:
open_ch = s1.pop(); // error
std::stack::pop()的返回类型是void,这意味着它没有返回值,自然不能赋值给char类型的open_ch。C++标准库这么设计是为了异常安全:如果pop()同时返回元素值,当元素的拷贝构造函数抛出异常时,栈顶元素已经被移除但无法成功返回,会导致数据丢失风险。
修复方案
要获取栈顶元素的值,你需要先用top()方法读取,再调用pop()移除它,把这行代码改成两句:
open_ch = s1.top(); // 先获取栈顶元素的值 s1.pop(); // 再移除栈顶元素
优化后的完整代码
另外,你的栈定义是stack<int> s1;,其实改成stack<char> s1;更贴合实际需求(毕竟你存的是字符类型的括号),虽然用int也能正常运行,但char更直观。修改后的完整代码如下:
#include <stack> #include <cstring> int check_matching_STL(const char* in) { stack<char> s1; // 改成stack<char>更合适 char ch, open_ch; int i, n = strlen(in); for (i = 0; i < n; i++) { ch = in[i]; switch (ch) { case '(': case '[': case '{': s1.push(ch); break; case ')': case ']': case '}': if (s1.empty()) return 0; else { open_ch = s1.top(); // 先获取栈顶元素 s1.pop(); // 再弹出栈顶 if ((open_ch == '(' && ch != ')') || (open_ch == '[' && ch != ']') || (open_ch == '{' && ch != '}')) return 0; break; } } } if (!s1.empty()) return 0; return 1; }
这样修改后,就能解决你遇到的赋值错误问题啦,程序应该可以正常验证括号的匹配性了。
内容的提问来源于stack exchange,提问作者김찬하
相关产品推荐
相关产品推荐

