动态数组元素无法赋值,栈实现字符串反转时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
相关产品推荐
相关产品推荐

