這篇內容主要講關於佇列的特殊實現,以及留的課後習題中的棧的特殊實現;
對於佇列的特殊實現的原因也是出發與對於使用**復用的方法實現的佇列的時間複雜度是線性的,雖然已經通過游標的方式解決了,但是這樣的話,複雜程度就會提公升,並且並不是很有趣,所以就提出了另一種實現方法,就是利用兩個棧實現乙個佇列;
首先:定義兩個棧,乙個是當有資料插入的時候利用的棧,就起名為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中講的那樣,建立兩個鍊錶,乙個孩子鍊錶,乙個組織鍊錶,因為二叉樹的孩子是分左右的,這個順序不能搞混,所以就直接是在每個二叉樹的結點中設定兩個指標,分別指向左右孩子,這樣就可以了,但是又有乙個問題隨之而來,那就是如何定位?這個問題唐老師給了乙個很形...