本帖最后由 幻想领域 于 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();
复制代码 希望大家能贴出更多回文解法。
|