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

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,提问作者김찬하

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:12:45