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

动态数组元素无法赋值,栈实现字符串反转时stack[top]值未更新

问题分析与修复

核心错误:赋值运算符误用

你的push函数里,把赋值操作写成了比较操作:

stack[top] == c; // 这是比较,不是赋值!

应该改成单等号的赋值:

stack[top] = c;

这就是栈内值始终未变化的根本原因——你根本没把字符存入栈,只是做了一次无意义的比较。

其他潜在问题及修复

  • 成员变量与全局变量命名冲突
    类中isFull函数调用的size是全局的const int size = 4,而非动态初始化的栈实际大小。给Stack类新增私有成员int capacity存储栈容量,替换全局size:

    class Stack{
        private:
            char* stack;
            int top;
            int capacity; // 存储栈的实际容量
        
        public:
            Stack() : top(-1), stack(nullptr), capacity(0) {} // 初始化指针避免野指针
            
            void Init_Size(int size)
            {
                capacity = size;
                stack = new char[capacity];
            }
            
            bool isFull()
            {
                return top == (capacity - 1); // 用capacity代替全局size
            }
            // 其余函数不变
    };
    
  • 反转字符串时的越界问题
    ReverseString里的result默认是空字符串,直接result[i] = stack.pop()会访问超出字符串长度的内存,导致未定义行为。先初始化result为对应长度的空字符串:

    string ReverseString(string str)
    {
        Stack stack;
        string result(str.length(), '\0'); // 初始化对应长度的空字符串
        
        stack.Init_Size(str.length());
        
        for (char ch : str)
        {
            stack.push(ch);
        }
        
        for (int i=0; i < str.length(); i++)
        {
            result[i] = stack.pop();
        }
        
        return result;
    }
    
  • 内存泄漏
    Stack类动态分配了char* stack,但未释放内存。添加析构函数:

    ~Stack()
    {
        delete[] stack;
    }
    

修正后的完整代码

#include <iostream>
#include <string>
using namespace std;

class Stack{
    private:
        char* stack;
        int top;
        int capacity;
    
    public:
        Stack() : top(-1), stack(nullptr), capacity(0) {}
        
        ~Stack()
        {
            delete[] stack;
        }
        
        void Init_Size(int size)
        {
            capacity = size;
            stack = new char[capacity];
        }
        
        bool isFull()
        {
            return top == (capacity - 1);
        }
        
        bool isEmpty()
        {
            return top == -1;
        }
        
        void push(char c)
        {
            if (isFull())
            {
                cout << "STACK IS FULL" << endl;
                return;
            }
            top++;
            stack[top] = c; // 修正赋值操作
            cout << "PUSHED " << stack[top] << " ONTO STACK" << endl;
        }
        
        char pop()
        {
            if (isEmpty())
            {
                cout << "STACK IS EMPTY" << endl;
                return '/'; //error
            }
            
            char temp = stack[top];
            cout << stack[top] << endl;
            top--;
            cout << "POPPED " << temp << " OFF STACK" << endl;
            return temp;
        }
};

string ReverseString(string str)
{
    Stack stack;
    string result(str.length(), '\0');
    
    stack.Init_Size(str.length());
    
    for (int i=0; i < str.length(); i++)
    {
        stack.push(str[i]);
    }
    
    for (int i=0; i < str.length(); i++)
    {
        result[i] = stack.pop();
    }
    
    return result;
}

int main()
{
    string str;
    
    cin >> str;
    
    cout << ReverseString(str) << endl;
}

内容的提问来源于stack exchange,提问作者JT937

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:05:17