唐老師資料結構專題六 下

2021-06-19 04:15:30 字數 3284 閱讀 2487

這篇內容主要講關於佇列的特殊實現,以及留的課後習題中的棧的特殊實現;

對於佇列的特殊實現的原因也是出發與對於使用**復用的方法實現的佇列的時間複雜度是線性的,雖然已經通過游標的方式解決了,但是這樣的話,複雜程度就會提公升,並且並不是很有趣,所以就提出了另一種實現方法,就是利用兩個棧實現乙個佇列;

首先:定義兩個棧,乙個是當有資料插入的時候利用的棧,就起名為stackin,另乙個是當刪除資料時要利用的棧,就起名為stackout;

然後:當有資料要插入的時候,比如插入1,2,3,壓入stackin棧中,此時的棧中的內容為

而要刪除資料的時候,便將in棧中的元素全部出棧,並壓入out中,此時out棧中的內容為

然後就可以按正常的出棧,進行刪除了 結果就是 1,2,3;

這正好與壓入棧中的順序一樣1,2,3;

並且當要刪除佇列元素的時候,要先檢測out棧中是否有元素,如果沒有,就要將in中的元素壓入out棧中,若有元素,直接將out中的元素,出棧即可

當要插入元素的時候,直接將元素壓入in棧中即可;

而對於棧的特殊實現,唐老師的意思是要用兩個佇列來實現乙個棧。我已開始的想法,是受上面的佇列形成想到的,就是也建立兩個站in 和out,然後當有元素插入式,判斷in佇列是否有元素,如果有,則全部輸出到out中去,然後將元素插入in佇列,再將剛剛插入out佇列的全部元素再全部放回in佇列中,這樣便形成了倒敘:

上圖便是我想的方法,但是這樣的話,沒插入乙個元素,便要進行一次來回折騰,時間複雜度不會太小,所以就想利用別的辦法,後來發現乙個很好地方法,就是當插入的時刻只要乙個佇列有元素(如果兩個都沒有,就選其中乙個),並將要插入的元素插入到裡邊,當要刪除元素的時候,只要將那個佇列裡的元素出最後乙個全部插入到另乙個佇列,然後再將剩下的元素輸出即可,然後再插入元素的時候,直接插入有乙個佇列即可;

先發兩個棧形成乙個佇列的**:

#include #include "squeue.h"

#include #include "linkstack.h"

#include "linklist.h"

//定義兩個棧的結構體

//乙個是用於輸入

//另乙個是用於輸出

typedef struct _tag_

tsque;

squeue* squeue_create() }

return ret;

}void squeue_destroy(squeue* queue)

void squeue_clear(squeue* queue) }

return ret;

}void* squeue_retrieve(squeue* queue)

}//這裡是pop 彈出操作

ret = linkstack_pop(sque->out); }

return ret;

}void* squeue_header(squeue* queue)

}//這裡是top 得到操作

ret = linkstack_top(sque->out); }

return ret;

}int squeue_length(squeue* queue)

return ret;

}

下面是兩個佇列實現乙個棧的**:

#include #include #include "questack.h"

#include "linklist.h"

#include "linkqueue.h"

typedef struct _tag_

tsquestack;

questack* questack_create() }

return sque;

}void questack_destroy(questack* qstack)

void questack_clear(questack* qstack)

}//插入元素

//如果只有其中乙個佇列不為空的話 那麼就將資料新增到這個不為空的佇列中

else

else if( linkqueue_length(sque->second) > 0 )

} }

return ret;

}//輸出資料

void* questack_retrieve(questack* qstack)

ret = linkqueue_retrieve(sque->first);

} else if( linkqueue_length(sque->second) > 0 )

ret = linkqueue_retrieve(sque->second);

} }}//得到頭元素

void* questack_top(questack* qstack)

ret = linkqueue_header(sque->first);

//再重新將元素 新增回去

} else if( linkqueue_length(sque->second) > 0 )

ret = linkqueue_header(sque->second);

//再重新將元素 新增回去

} }

return ret;

}int questack_length(questack* qstack)

return ret;

}

唐老師 資料結構 專題五

這個專題講的內容是遞迴,並且這節的 量都不是很大,關鍵就是遞迴的思想,對於可以用遞迴去完成的任務,應該運用整體的思想,不用把每一步都想得很清楚,並且一定要有最後的結束判斷 對 還有個重要內容就是唐老師講到了計算機在函式與函式呼叫的時候,要利用棧,而這個棧是類似於我們之前用到的順序棧,就是一開始就已經...

唐老師資料結構專題八2

前面已經說到,二叉樹使用及其廣泛,現在就來說一下 在這裡先進行宣告 這裡所有樹的結點完全沒有指向父親結點的指標,唐老師沒有指名原因,但是他後面的一句話,感覺應該是他的原因,那就是做出二叉樹,也是為了節省空間,所以就沒有在樹節點裡包含指向父親結點的指標。首先是二叉樹的定義 二叉樹是由 n 個結點組成的...

唐老師資料結構專題八3

關於二叉樹的建立 這裡有個問題,就是二叉樹,就不能想1中講的那樣,建立兩個鍊錶,乙個孩子鍊錶,乙個組織鍊錶,因為二叉樹的孩子是分左右的,這個順序不能搞混,所以就直接是在每個二叉樹的結點中設定兩個指標,分別指向左右孩子,這樣就可以了,但是又有乙個問題隨之而來,那就是如何定位?這個問題唐老師給了乙個很形...