算法分析:迴文是指正讀和反讀均相同的字符序列,例如:“abba”,“abcba”
所用到的結構:單鏈表,棧
(單鏈表用於存儲字符串,棧用於對單鏈表中字符串的判定)
算法:1,構造空棧 s
2,將單鏈表存儲的字符串中的前一半字符進棧
3,將棧中的字符逐個與單鏈表中的後半部分的字符進行比較。如果字符全部相等,則判定字符串是迴文;如果有一個字符不相等,則判定字符串不是迴文。
4,考慮字符串的構造:1:“abba” 2:“abcba”
Void huiwen(linklist L , int n)
{
Int i ;
Char ch ;
Linklist *p;
Snode *ls;
Initstack (ls);
p=L->nest; //初始化指針
i=1;
while(i<=(n/2) //將單鏈表中的前半部分進棧
{
ch = p->data;
ls->top++;
ls->data[ls->top]=ch; // 將ch 送人棧定指針*ls所指向的單元(Snode *ls;)
p=p->next; i++;
}
//考慮字符串的構造:1:“abba” 2:“abcba”
if((n%2)= =1)p=p->next; //若n爲奇數,則中間位置的字符不用進棧,p指向單鏈表後半部分的第一個節點
k=1; //設置標誌點 可以用0和1來標記:k=1 表示對應字符全部相等,k=0 表示至少有一對字符不相等
while((p!=null)&&(k= =1)) //將棧ls中的字符逐個與單鏈表後半部分的字符進行比較
{
ch=ls-> data[ls->top--]; //將棧頂指針所指向的單元內的值賦給ch
if(p->data= =ch) //若p指向的節點字符等於順序棧中棧頂指向的字符,則p 順鏈後移;若p指向的節點字符不等於順序棧中棧頂指向的字符,則k=0
p=p->next;
else
k=0;
}
if(k) printf(“字符串是迴文”);
else printf(“字符串不是迴文”);
}
Void Initstack (Lstack & ls) //構建一個空棧
{
ls=(snode *)malloc(sizeof(snode));
ls->top= -1;
}