如何使用棧“先進後出的特性如何巧妙地借助輔助棧如何在結構體中定義可共享的靜態成員變量 題目
#include#include #include using namespace std; /** 題目: 定義棧的數據結構 要求添加一個min函數,找出棧的最小元素 要求min、push、pop函數的時間復雜度都為O(1) 思路 牢牢把握住棧【先進後出】的特性,模擬各種實際情況,得出算法 棧結構體中添加一個輔助棧,這裡稱為【最小值棧】,存儲最小值的歷史記錄 所以該最小值棧的棧頂即為當前棧的最小元素 當push進來的元素值大於、等於最小值棧的棧頂,最小值棧不變 因為根據棧的特性,只有當前最小值元素上面的所有元素都出去的時候,該最小值元素才能pop出去 反之,則將該元素放進最小值棧 當pop出去的元素不是最小值棧棧頂,則最小值棧不變 反之,最小值棧pop出棧頂 這樣如果pop出去的值為當前最小值,則最小值棧也pop出一個元素 此時最小值棧的棧頂就是下一個最小值元素 */ /* 創建棧結點結構體 value 值 nextNode 下一個結點 push() 入棧函數 pop() 出棧函數 min() 求最小值函數 push2() 入棧並且求最小值 pop2() 出棧並且求最小值 */ struct StackNode{ int value; static StackNode * minNode; StackNode * nextNode; /** push() 入棧函數 value 入棧的值 返回 棧頂 */ StackNode * push(int value){ StackNode * top = new StackNode(); if(NULL!=this){ top=this; StackNode * push = new StackNode(); push->value=value; push->nextNode=top; top=push; }else{ top->nextNode=NULL; top->value=value; } cout<<入棧,value=< value< nextNode; } else{ cout<<棧已經為空< value){ cout<<最小值棧入棧< push(value); } }else{ //空,則直接放進去 cout< push(value); } }else{ //pop //非空且pop的值等於最小值,則最小值棧pop if((NULL!=minNode)&&(minNode->value==value)){ cout<<最小值棧出棧< pop(); } } if(NULL!=minNode) cout<<現在棧的最小值value=< value< push(value); this->min(true,value); return node; } //pop+min StackNode* pop2(){ int value = this->value; StackNode* node=this->pop(); this->min(false,value); return node; } }; //結構體靜態變量初始化! StackNode * StackNode::minNode = NULL; StackNode * stack; void main() { stack=stack->push2(5); stack=stack->push2(2); stack=stack->push2(4); stack=stack->push2(1); stack=stack->push2(1); while(NULL!=stack){ stack=stack->pop2(); } system(pause); }