自定义栈实现字符串反转检测回文时输出乱码问题排查
回文字符串检测程序问题修复
存在的核心问题
- 自定义栈的
push方法逻辑倒置:未将传入字符存入栈数组,反而将未初始化的栈数组值赋值给输入参数,导致栈内无有效数据 - 栈的
pop方法使用了未定义变量l,且返回值错误,应该返回弹出前的栈顶字符 - 栈的
getTop方法功能错误:当前返回栈顶索引,实际应该返回栈顶存储的字符 - 反转函数逻辑混乱:存在
letters[-1]的越界访问,且错误重复调用push打乱栈结构,未将栈弹出的字符存入结果数组 - 自定义字符串长度计算函数逻辑冗余,嵌套循环无意义,长度计算结果异常
修复后完整代码
#include <iostream> #include <string> using namespace std; #define Max 100000 class Stack { private: int top = -1; char letters[Max]; public: void setTop(int t) { top = t; } // 修复getTop:返回栈顶字符而非索引 char getTop() { if (!isEmptyStack()) { return letters[top]; } return '\0'; } bool isEmptyStack() { return top == -1; } // 修复push:将传入字符存入栈 void push(char x, int s) { if (top != s - 1) { top++; letters[top] = x; } } // 修复pop:正确返回弹出的字符 char pop() { if (!isEmptyStack()) { char temp = letters[top]; top--; return temp; } return '\0'; } }; // 修复反转逻辑 void reverse(char input[], char output[], int size, Stack& stack) { // 先把所有字符压入栈 for (int i = 0; i < size; i++) { stack.push(input[i], Max); } int i = 0; // 弹出栈顶字符存入输出数组 while (!stack.isEmptyStack()) { output[i] = stack.pop(); i++; } // 给输出加字符串结束符避免乱码 output[size] = '\0'; cout << "反转结果:" << output << endl; } // 修复字符串长度计算逻辑 int myStringLength(const char* letter) { int c = 0; while (letter[c] != '\0') { c++; } return c; } int main() { Stack stack; string w; cout << "Enter a Word: "; getline(cin, w); char* letters = &w[0]; cout << "输入内容:" << letters << endl; int size = myStringLength(letters); // 定义存储反转结果的数组 char reversed[Max]; reverse(letters, reversed, size, stack); // 后续加回文判断即可:strcmp(letters, reversed) == 0 则为回文 return 0; }
验证效果
输入food时,程序会输出反转结果doof,符合预期,后续只需添加原串与反转串的相等判断即可完成回文检测功能。
内容的提问来源于stack exchange,提问作者supercar lover
相关产品推荐
相关产品推荐

