内容:
回文是指正读和反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。
1.算法分析:
回文如上述所言,是指正读和反读均相同的字符序列。所以要判断一串字符串是不是回文,就要把字符串逆序,然后与原来的字符串作比较,若二者相同,则说明是回文。
针对这个问题,我们可以采用栈来解决这个问题,因为栈具有先进后出的特性,我们只需要将字符入栈,随后再进行出栈,和原本的字符串相同位对比即可。若二者相同,则说明是回文,当字符很短的时候,程序可以很快的运行出来,但是当需要判断的字符串长度很长的时候,全部入栈会浪费时间,所以为了缩短比较的时间,我们可以将一半字符入栈,然后出栈,与余下的另一半比较。若栈顶指针top==0时,则该字符串可以回文,反之,栈顶指针没有到0而比对结果不同,则说明不能回文。
所以设计算法时,首先需要初始化一个线性表,写出入栈,出栈程序。然后将字符串的长度求出来,利用length()/2-1求出一半字符位置并将其入栈,同时判断结果的奇偶性,找出需要字符匹配的起始下标位置。全部入栈后出栈,使用fo循环逐个比较。若比对不符,直接输出“该字符串不能回文”,若栈顶指针top==0,则输出“该字符串可以回文”。
2.概要设计:
函数 | 作用 |
Stack() | 初始化一个顺序栈 |
Empty() | 实现栈的判空操作 |
Pop() | 实现字符串的出栈操作 |
Main() | 实现回文算法 |
表1 概要设计
3.程序的运行流程图:
图1 程序流程图
4.源程序(Dev-c++ 5.11调试通过):
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define maxsize 100
typedef char datatype; //定义一个顺序栈
typedef int status;
typedef struct{
datatype data[maxsize];
int top;
}stack;
//初始化顺序栈
void newstack(stack *S)
{
S=(stack*)malloc(sizeof(stack));
S->top==-1;
}
//入栈
status push(stack*S,datatype e)
{
if(S->top==maxsize-1)
return 0;
else
{
S->top++;
S->data[S->top]=e;
return 1;
}
}
//出栈
status pop(stack *S,datatype *e)
{
if(S->top==-1)
return 0;
else
{
*e=S->data[S->top];
S->top--;
return *e;
}
}
//主函数
int main()
{
stack S;
newstack(&S);
datatype a[100];
int length,i,next;
datatype e;
gets(a);
int mid;
//求出输入字符串的长度
length=strlen(a);
//找出字符串的中间结点
mid=length/2-1;
//将找出的字符串的前一半进行入栈
for(i=0;i<=mid;i++)
{
push(&S,a[i]);
}
//判断字符串的长度是奇数还是偶数,找出匹配的起始下标
if(length%2==0)
{
next=mid+1;
}
else
{
next=mid+2;
}
//开始匹配,如果栈中所有元素均比较,则说明是,反之为否
for(i=next;i<=length-1;i++)
{
pop(&S,&e);
if(e!=a[i])
{
printf("该字符串不能回文\n");
return 0;
}
}
printf("该字符串可以回文\n");
return 0;
}
5.测试结果
5.1 纯数字(可回文且数字数为偶数):
图2 纯数字
5.2 纯数字(可回文且为奇数个):
图3 纯数字2
5.3 纯数字(不可回文测试):
图4 纯数字3
5.4 字母(goog):
图5 纯数字4
5.5 字母(good):
图6 字 母
5.6 字母+数字(可回文):
图7 字母+数字
5.7 字母+数字(不可回文):
图8 字母+数字(不可回文)
求解及实列演示过程结束。但需要注意的是,该程序不能测试汉字。本程序是利用栈的先进后出的特性。将一半字符入栈然后出栈,与剩下的相比较。之后使用if.....else语句判断栈顶指针所在位置,得出结果。
Java代码如下:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
StringBuilder sb = new StringBuilder(str);
if (sb.reverse().toString().equals(str)) {
System.out.println(str + "是回文");
} else {
System.out.println(str + "不是回文");
}
}
测试用例: