判斷是否為回文字串 棧 佇列 鍊錶 快慢指標

2021-10-04 16:11:42 字數 4071 閱讀 3212

方法一:

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將 片顯示選擇的高亮樣式進行展示 全...