回文的判定C语言(栈实现),Java简单实现

内容:

    回文是指正读和反读均相同的字符序列,如“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 + "不是回文");
    }
}

测试用例:

Guess you like

Origin blog.csdn.net/qbyyds/article/details/120922647