說明:編程菜鳥一枚,學習左程雲老師的《程序員代碼面試指南》過程中將書中的例子改寫成C++實現
題目:
實現一個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。
要求:
1、pop、push、getMin操作的時間複雜度都是O(1)
2、設計的棧類型可以輸用現成的棧結構
詳細解析見《程序員代碼面試指南》第一章第一題
方案一C++代碼:
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template <class T>
class Stack {
public:
void push(int num){
if(stackmin.empty()){
stackmin.push(num);
}
else if(num<stackmin.top()){
stackmin.push(num);
}
stackdata.push(num);
};
int pop(){
assert(!stackdata.empty() && !stackmin.empty());
int temp=stackdata.top();
if(temp==stackmin.top()){
stackmin.pop();
}
stackdata.pop();
return temp;
};
int getmin(){
assert(!stackmin.empty());
return stackmin.top();
};
private:
stack<int> stackdata;
stack<int> stackmin;
};
int main()
{
Stack<int> example1;
cout<<"build example1"<<endl;
example1.push(1);
example1.push(2);
example1.push(5);
example1.pop();
int min1=example1.getmin();
cout<<min1<<endl;
}
方案二C++代碼:
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template <class T>
class Stack {
public:
void push(int num){
if(stackmin.empty()){
stackmin.push(num);
}
else if(num<stackmin.top()){
stackmin.push(num);
}
else{
stackmin.push(stackmin.top());
}
stackdata.push(num);
};
int pop(){
assert(!stackdata.empty() && !stackmin.empty());
stackmin.pop();
int temp=stackdata.top();
stackdata.pop();
return temp;
};
int getmin(){
assert(!stackmin.empty());
return stackmin.top();
};
private:
stack<int> stackdata;
stack<int> stackmin;
};
int main()
{
Stack<int> example1;
cout<<"build example1"<<endl;
example1.push(1);
example1.push(2);
example1.push(5);
example1.pop();
int min1=example1.getmin();
cout<<min1<<endl;
}