實現乙個棧,要求實現push(壓棧),pop(出棧),min(返回最小值的操作)的時間複雜度為o(1)
我們知道棧是後進先出的一種資料結構,這種資料結構只允許在棧頂進行插入刪除,所以要實現棧這種資料結構最好的結構就是順序表.當尾插尾刪多的時候,鍊錶存在開闢空間和刪除空間的時間消耗所以此時順序表優於鍊錶.結構選好之後就是如何求出棧的元素的最小值了?
思路一:
如果一次可以將同乙個資料進行兩次壓棧
一.要壓入的資料比棧頂的資料大
(1).將原來棧頂的元素儲存起來再pop掉
(2).將新元素壓棧,再將原來棧頂的元素壓棧
二.要壓入的資料比棧頂的資料小
直接將該資料兩次壓棧
如果每次都如此壓棧的話到最後棧頂的元素一定是所有資料中最小的元素,而且也不會改變入棧的順序
思路二:
利用兩個棧,乙個棧按照正確的壓棧順序壓棧,乙個棧用來儲存最小值;
(1).如果stack1是空棧或者要入棧的元素小於stack2的棧頂元素則將該資料即壓入stack1,也壓入stack2中
(2).如果要入棧的元素大於stack2的棧頂元素則只需要將該資料壓入stack1中
此時stack2中一定儲存的是原來入棧元素的最小值了
以上兩種想法都是以空間換時間,時間複雜度為o(1)
思路一的實現:
//兩個元素為一組,棧頂為最小的元素
template
class minstack
else
}void pop()
t& mindata()
t& top()
protected:
stack _ptr;
};思路二的實現:
//利用兩個棧,其中乙個儲存最小值
template
class minstack2
else
}void pop()
_ptr1.pop();
} t& mindata()
protected:
stack _ptr1; //存放資料
stack _ptr2; //最小值
};注意:在想法二的pop函式的實現中_ptr2也需要調整,當兩個棧棧頂元素一致時才可調整_ptr2的棧頂元素,否則棧的最小值會一直是原先的最小值,無法動態修改.
test.cpp
void testminstack()
{ minstack ms;
ms.push(5);
ms.push(1);
ms.push(2);
ms.push(3);
ms.pop();
cout< ms2;
ms2.push(5);
ms2.push(3);
ms2.push(6);
ms2.push(0);
ms2.push(2);
cout< 通過測試以上兩種**都是可實現的...
乙個棧實現另乙個棧排序
乙個棧中元素為整形,現在想將這個棧從棧頂到棧底自大到小排序,允許申請乙個棧。除此之外無其他資料結構。允許申請新變數,如何完成排序?1.設定需要排序的棧為stack,輔助的棧為help,從stack彈出的當前值為curt 2.將stack依次彈出,判斷彈出的值curt與help的棧頂元素大小關係,如果...
實現push pop min皆為O(1)的棧
前些時間筆試,遇到這樣一道題,要求實現乙個push pop min操作皆為o 1 的棧。當時想到的是使用堆或者紅黑樹維護最小值,這顯然都是無法達到o 1 要求的。後來參考網上思路,實現邏輯也很簡潔,就是使用另乙個棧維護乙個最小元素集 include include include using nam...
java 實現乙個棧
package zhangtingting public class stacktest 也可以自己設定長度,即容量 public stacktest int len 返回元素個數 public int size 返回陣列長度,即容量 public int capacity 實現動態的陣列 publ...