黑马程序员技术交流社区
标题: 探讨回文的多种解法 [打印本页]
作者: 欧玉斌 时间: 2012-10-28 00:12
标题: 探讨回文的多种解法
本帖最后由 幻想领域 于 2012-10-28 00:18 编辑
上半年参加c语言比赛,接触了一些的常见算法,其中比较常见的就是求回文了。
回文:称正读和反读都相同的字符序列为“回文”,如“abba”、“abccba”、12321、123321是“回文”,“abcde”和“ababab”则不是“回文”。
一般可以用栈、队列等方式来解决(关于栈、队列的区别,大家也可以讨论一下,最好能简洁生动)。
下面我想出的几种算法,大家看看还没有其他更好的办法么?
(大半夜发贴不容易,版主记得加分哈,发帖除了为了挣积分,也是为五期交流区挣人气,大家积极发帖答题,别让五期人气低)
这是c语言的解法,主要是将数组元素反序输出:
- #include<stdio.h>
- #include<string.h>
- int main(void)
- {
- char str[100];
- int i, len;
- printf("please input string");
- gets(str);
- len = strlen(str);
- for (i = 0; i < len / 2; i++)
- {
- if (str[i] != str[len-1-i])
- {
- break;
- }
- }
- if (i == len / 2)
- {
- printf("%s is huiwen\n", str);
- }
- else
- {
- printf("%s not is huiwen\n", str);
- }
- getchar();
- }
复制代码 下面是C#的第一种解法,将原数组逆向存放到另一数组,然后进行对比:- // --------------- 算法一:根据数组元素----------------------------
- Console.WriteLine("算法1:请输入一个字符串!");
- string str1 = Console.ReadLine();
- StringBuilder a = new StringBuilder();//声明一个可变的字符,用于逆向存放sString里的元素
- //逆向存放sString里的元素
- for (int i = str1.Length - 1; i >= 0; i--)
- {
- a.Append(str1[i]);//循环附加
- }
- if (str1.Equals(a.ToString()))//Equals用于判定两对象是否具有相同值
- Console.WriteLine("是回文");
- else
- Console.WriteLine("不是回文");
复制代码 这是c#的第二种算法:- // ------------------算法二:利用栈先进后出,队列先进先出的特点----------------
- //abba
- Console.WriteLine("算法2:请输入一个字符串!");
- //调用.net里面自带的Queue,Stack,并初始化
- Queue<char> queue = new Queue<char>();
- Stack<char> stack = new Stack<char>();
- string str2 = Console.ReadLine(); //获取输入字符
- for (int i = 0; i < str2.Length; ++i) //放入栈和队列
- {
- queue.Enqueue(str2[i]);
- stack.Push(str2[i]);
- }
- IsHuiWen(queue, stack);
复制代码 IsHuiWen的方法是我自己写的:- //检验函数,只需要检验1/2的位置,因为只需要检测前半部分和后半部分是否相同。
- static void IsHuiWen(Queue<char> queue, Stack<char> stack)
- {//aabb /abbaa
- //abcd
- // abbba
- int i = 0, total = 0;
- bool isHuiWen = true;
- //确定所要取出的字数,分奇数偶数两种情况
- if (queue.Count % 2 == 0)
- total = queue.Count / 2;
- else
- total = queue.Count / 2 + 1;
- //通过循环比对出栈元素和出队元素是否相同
- while (queue.Count != 0 && stack.Count != 0)
- {
- if (queue.Dequeue() != stack.Pop()) //不相等
- {
- isHuiWen = false;
- break;
- }
- else if (i == total) //检查到一半时,跳出循环
- break;
- ++i;
- }
- if (!isHuiWen)
- Console.WriteLine("这不是回文");
- else
- Console.WriteLine("这是回文");
- }
复制代码 C#第三种解法:- //--------------------------算法三:-----------
- Console.WriteLine("算法3:请输入一个字符串!");
- string str3 = Console.ReadLine();
- string s=null;
- //将str3压入栈中
- for (int i = 0; i < str3.Length; ++i)
- {
- stack.Push(str3[i]);
- }
- //循环将栈元素放入s中
- while (stack.Count>0)
- {
- s +=stack.Pop().ToString();
- }
- if (str3!= s)
- {
- Console.WriteLine("这不是回文");
- }
- else{ Console.WriteLine("这是回文");}
- Console.ReadLine();
复制代码 希望大家能贴出更多回文解法。
作者: 杨深 时间: 2012-10-28 02:58
栈(stack)是一种特殊的线性表。如洗碗,在通常情况下,最先冼净的碗总是放在最底下,后冼净的碗总是摞在最顶上。而在使用时,却是从顶上拿取,也就是说,后冼的先取用,后摞上的先取用。好比我们把冼净的碗“摞上”称为进栈,把“取用碗”称为出栈,那么,上例的特点是:后进栈的先出栈。然而,摞起来的碗实际上是一个表,只不过“进栈”和“出栈”,或者说,元素的插入和删除是在表的一端进行而已。
队列(Queue)也是线性表的一种特殊情况,但它与栈不同,其所有的插入均限定在表的一端进行,而所有
的删除则限定在表的另一端进行。允许插入的一端称队尾(Rear),允许删除的一端称队头(Front)。队列
的结构特点是先进队的元素先出队。假设有队列Q=(a1, a2,a3,…,an),则队列Q中的元素是按a1,
a2,a3,…,an的次序进队,而第一个出队的应该是a1,第二个出队的应该是 a2,只有在ai-1出队以后
,ai才可以出队(1≤i≤n)。因此,通常又把队列叫做先进先出(FIFI—First In First Out)表。再
一句话总结:
栈(数据结构):后进先出
队列:先进先出
作者: 许庭洲 时间: 2012-10-28 08:05
三个C#判断回文方法值得学习ing!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |