方法一:
1.將字串按照使用者輸入的順序分別入棧和佇列
2.分別從佇列和棧中取出首個字元
3.比較取出的字元,若相等,繼續分別從佇列和棧中取首個字元;
否則跳出迴圈,並設定標誌 flag=0;
4.若佇列和棧中的字元取完,則結束,設定標誌flag=1;
5.flag=1,表示字元從前往後和從後往前的序列完全匹配,該字串屬於回文
6.flag=0,表示字元從前往後和從後往前的序列不完全匹配,該字串不屬於回文
#include
#include
#define stack_init_size 100
#define stackincrement 10
typedef
char elemtype;
typedef
struct strstack
sqstack;
//定義乙個棧
struct strqueue
;typedef
struct queue
queue;
//定義乙個佇列
void
initstack
(sqstack *s)
;//初始化棧
void
push_stack
(sqstack *s, elemtype e)
;//入棧
void
pop(sqstack *s, elemtype *e)
;//出棧
void
initqueue
(queue *q)
;//初始化佇列
void
inserqueue
(queue *q, elemtype e)
;//入佇列
void
deletequeue
(queue *q, elemtype *e)
;//出佇列
intstacklen
(sqstack s)
;//求棧的長度
intmain()
len =
stacklen
(s);
//棧的長度
for(
int i =
0; i < len; i++)}
if(flag ==0)
else
return0;
}void
initstack
(sqstack *s)
//初始化棧
s->top = s->base;
s->stacksize = stackincrement;
}void
push_stack
(sqstack *s, elemtype e)
//入棧}*
(s->top)
= e;
s->top ++;}
void
pop(sqstack *s, elemtype *e)
//出棧
*e =*--
(s->top);}
void
initqueue
(queue *q)
//初始化佇列
else
}void
inserqueue
(queue *q, elemtype e)
//入佇列
else
}void
deletequeue
(queue *q, elemtype *e)
//出佇列
else
free
(q);}}
intstacklen
(sqstack s)
//求棧的長度
方法二:
1、將字元存入乙個雙向迴圈鍊錶
2、從表頭往後和表尾往前分別取乙個元素,若不相等,則設定flag = 0,並跳出迴圈;
3、若元素全部取完,則設定flag = 1;
4、flag=1,表示字元從前往後和從後往前的序列完全匹配,該字串屬於回文
5、flag=0,表示字元從前往後和從後往前的序列不完全匹配,該字串不屬於回文
#include
#include
typedef
char elemtype;
//定義乙個雙向迴圈鍊錶
typedef
struct dualnode
dualnode,
*dulinklist;
void
init_dulinklist
(dulinklist *l)
;//初始化雙向迴圈鍊錶
void
insertdulinklist
(dulinklist *l, elemtype e)
;//插入元素
intmain()
//依次插入
dulinklist head, tail;
head = l->next;
//head指向第乙個有元素的節點
tail = l->prior;
//tail指向最後乙個有元素的節點
while
(head != tail)
head = head->next;
tail = tail->prior;}if
(flag ==1)
else
return0;
}void
init_dulinklist
(dulinklist *l)
//初始化雙向迴圈鍊錶
else
/*頭結點data域沒有資料*/
}void
insertdulinklist
(dulinklist *l, elemtype e)
方法三:
1、利用快慢指標把單鏈表前半部分逆轉並把鍊錶分成兩個鍊錶。
2、依次比較兩個單鏈表節點的data域,出現不相同的地方,則必不為回文字串,若兩個鍊錶走到了最後,退出迴圈,則為回文串
#include
#include
typedef
char elemtype;
typedef
struct lnode
linknode,
*linklist;
void
initlist
(linklist *l,
int n)
;linklist div_reverselist
(linklist *l)
;void
compare
(linklist former,linklist latter)
;int
main()
void
initlist
(linklist *l,
int n)
p->next =
null;}
linklist div_reverselist
(linklist *l)
//將鍊錶逆轉一半分成兩個等長鍊錶
while
(lslow->next !=
null
&&lfast->next !=
null
&& lfast->next->next !=
null)if
(lfast->next ==
null
)//此時,鍊錶分成了以lslow和*l為頭結點的兩個單鏈表
else
//(lfast->next->next == null)
//此時鍊錶分成了以temp和*l為頭結點的兩個鍊錶
}void
compare
(linklist former,linklist latter)
former = former->next;
latter = latter->next;}if
(former ==
null
)//走到最後
}
演算法 判斷是否為回文字串
問題 字串是否為回文字串,如abcba 單鏈表儲存 思路 快慢指標找到中間節點,並且在慢指標移動時改變node的指向。找到中間節點以後,從中間節點出發,前後遍歷比較值 步驟 1.判斷傳入節點是否為空,接下來節點是否為空 非空判斷 2.快慢指標移動,快指標正常移動,慢指標在移動時,改變node的指標方...
Python判斷是否為回文鍊錶
突然發現python語法的優美和簡潔,清爽,不拖泥帶水。龜叔 guido van rossum 就說 除了不能生孩子,python真的能幹很多事。definition for singly linked list.如果位元組面試 時間複雜度o n 空間複雜度o 1 class listnode de...
用棧判斷是否是回文字串
toc 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下markdown的基本語法知識。全新的介面設計,將會帶來全新的寫作體驗 在創作中心設定你喜愛的 高亮樣式,markdown將 片顯示選擇的高亮樣式進行展示 全...