C#回文检测栈程序失效,请求技术排查与修复支持
问题排查与修复方案
首先,咱们来拆解你的代码里的两个核心问题,这也是导致程序无法正确判断回文的原因:
1. Stack.Equals() 比较的是对象引用,而非内容
你现在用cstack.Equals(rstack)来判断两个栈是否相等,但C#里的非泛型Stack类的Equals方法继承自Object.Equals,它默认只比较两个对象是不是同一个实例——也就是说,只要cstack和rstack是分开创建的两个栈,不管里面内容是不是一样,这个判断都会返回false,这肯定没法正确判断回文。
2. 反转栈的方式错误
第二个foreach循环遍历cstack的时候,你需要知道:栈的枚举是从顶部元素开始的。比如你输入"aba",cstack里的元素顺序(从底到顶)是a -> b -> a,遍历的时候拿到的顺序是a(顶)、b、a(底),然后你把这些元素Push到rstack里,最终rstack的元素顺序和cstack完全一样,根本没有实现反转的效果。
修复后的代码示例
这里给你两种修复思路,第一种是修正你原来的栈实现方式,第二种是更简洁的回文判断方法:
方法一:基于栈的正确实现
// 建议用泛型Stack<char>,类型更安全 Stack<char> cstack = new Stack<char>(); Stack<char> rstack = new Stack<char>(); Console.WriteLine("Enter a palindrome string"); string input = Console.ReadLine(); // 把输入字符压入原栈 foreach (char c in input) { cstack.Push(c); } // 要反转栈,应该先把原栈的元素Pop出来,再Push到反转栈 // 注意:Pop会修改原栈,所以先复制一份原栈的内容 Stack<char> tempStack = new Stack<char>(cstack); while (tempStack.Count > 0) { rstack.Push(tempStack.Pop()); } // 现在逐个比较两个栈的元素 bool isPalindrome = true; while (cstack.Count > 0 && rstack.Count > 0) { if (cstack.Pop() != rstack.Pop()) { isPalindrome = false; break; } } Console.WriteLine(isPalindrome ? "String is a palindrome" : "String is not a palindrome"); Console.ReadLine();
方法二:更简洁的回文判断(无需栈)
其实判断回文不需要用到栈,直接对比字符串的首尾字符会更简单高效:
Console.WriteLine("Enter a palindrome string"); string input = Console.ReadLine(); bool isPalindrome = true; int left = 0; int right = input.Length - 1; while (left < right) { if (input[left] != input[right]) { isPalindrome = false; break; } left++; right--; } Console.WriteLine(isPalindrome ? "String is a palindrome" : "String is not a palindrome"); Console.ReadLine();
额外提示
如果需要忽略大小写或者空格(比如判断"A man a plan a canal Panama"这种带空格的回文),可以先对输入做预处理:
input = input.ToLower().Replace(" ", "");
内容的提问来源于stack exchange,提问作者nat1
相关产品推荐
相关产品推荐

