迴文串:一串正着讀和反着讀都是一樣的一種特殊字符串
例如:level、abba 這兩個字符串就被稱爲迴文串
判斷迴文串,我推薦兩種方法:反轉比較法和中分比較法(名稱是自己起的哈,有些醜陋)
一、反轉比較法
對於c++的同學這個就十分簡單了
我們輸入的字符串類型定位string型,然後使用reverse函數就可以,然後我們直接比較str1與str2是否相等,相等的話那麼就表示輸入的字符串爲迴文串。
reverse(str2.begin(), str2.end());
當然,輸入char、int數組也是可以,直接使用reverse函數
reverse(str2,str2+strlen(str2));
對於不讓用函數或者是c的同學,那就自己寫一個reverse函數,這個還是比較好實現的,定義一個新的數組,然後通過遞歸進行反轉。
void reverse(char * str)
{
int len=strlen(str);
char *ch=str+len-1;
while(len>1)
{
char tmp=*str;
*str=*ch;
*ch='\0';
reverse(str+1);
*ch = tmp;
len--;
}
}
二、中分比較法
這種方法的話這裏我介紹用帶頭結點的單鏈表存每一個元素,我們再建立一個棧,我們用棧存放前半部分的數據,如果數據元素個數是奇數的話,我們加一個特判,不處理這個節點。當鏈表當前節點走到一半後,我們對棧頂元素與當前節點進行比較,如果不相等,那麼就說明不是迴文串,,如果相等棧頂元素出棧,指針往後一位。如果走到結尾都相等的話,那麼就表示是迴文串。
下面代碼輸入格式爲:
字符串長度
字符串
例如:
5
abbba
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
char num;
struct node *next;
}LinkList;
LinkList *init(LinkList *l)
{
l=(LinkList *)malloc(sizeof(LinkList));
l->next=NULL;
return l;
}
LinkList *create(int n)
{
int i,x;
LinkList *l,*tmp,*p;
l=init(l);
tmp=l;
for(i=0;i<n;i++)
{
scanf("%c",&x);
p=(LinkList *)malloc(sizeof(LinkList));
p->num=x;
p->next=NULL;
tmp->next=p;
tmp=tmp->next;
}
return l;
}
int cala(LinkList *l,int n)
{
char a[1005];
int mid=n/2,i=1,na=0;
LinkList *tmp;
tmp=l->next;
while(tmp)
{
if(mid+1==i&&n%2!=0)
{
i++;
tmp=tmp->next;
continue;
}
else if(i<=mid) a[na++]=tmp->num;
else if(i>mid)
{
if(a[--na]!=tmp->num)
{
return 0;
}
}
i++;
tmp=tmp->next;
}
return 1;
}
int main()
{
LinkList *l;
int n,i,flag;
scanf("%d",&n);
getchar();
l=create(n);
flag=cala(l,n);
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}