按升序對棧進行排序(即最大元素位於棧頂)。最多隻能使用一個額外的棧存放臨時數據,但不得將元素複製到別的數據結構(如數組)。java
該棧支持以下操做:push, pop, peek,和isEmpty算法
若是能夠支持兩個棧,咱們能夠每一次遍歷棧1,將最小的元素放入棧2,把棧3做爲搜索時的緩衝區數組
一、方法一:實現初步的排序算法:搜索整個棧,找出最小元素,以後將其壓入另外一個棧。而後,在剩餘元素中找出最小的壓入棧。數據結構
注意:實際上須要三個棧:s1爲原棧,s2位最終排好序的棧,s3在搜索s1時用做緩衝區。在s1中搜索最小值,須要彈出s1的元素,並將它們壓入緩衝區s3。但最多隻能使用一個額外的棧,此方法不合適。app
二、方法二:spa
/** * 從s1中逐一彈出元素,按順序插入s2中。 */
咱們不須要反覆搜索棧1來依次得到最小值,假設棧s是要排序的棧,棧r是已排序的棧.net
s = [5,10,7]blog
r = [12,8 ,3,1]排序
棧頂元素5在r中的正確位置應該是3的上面,咱們能夠先彈出5,反正5是不管如何都要從s壓入r的,而後將12和8壓入棧s,而後將5壓入棧r遞歸
注意這是12和8沒有在r中了,可是隻要咱們不改變它們在s中的順序,重複上面的步驟,12和8一次從s彈出再壓入r仍是在5的上面,r依然是有序的。
時間複雜度爲O(n^2),空間複雜度O(n)
[java] view plain copy
方法三:
前提:若容許使用的棧數量不限。實現修改版的快速排序和歸併排序,要求每層遞歸都建立兩個額外的棧。
*歸併排序:建立兩個棧,並將原棧分爲兩部分。遞歸排序每一個棧,而後將其歸併到一塊兒並排好序,放回原來的棧中。
*快速排序:建立兩個額外的 棧,並根據基準元素(pivot element)將這個棧分爲兩個棧,這兩個棧會進行遞歸排序,而後歸併在一塊兒,放回原來的棧中。