考点:C++栈和队列标准库函数、实现特殊栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
知识点
1.栈
在栈中应包含头文件: #include< stack >
定义: stack< int > s;
s.empty(); //如果栈为空则返回true, 否则返回false; s.size(); //返回栈中元素的个数 s.top(); //返回栈顶元素, 但不删除该元素 s.pop(); //弹出栈顶元素, 但不返回其值 s.push(); //将元素压入栈顶
2.队列
包含头文件: #include< queue >
定义: queue< int > q;
q.empty(); //如果队列为空返回true, 否则返回false q.size(); //返回队列中元素的个数 q.front(); //返回队首元素但不删除该元素 q.pop(); //弹出队首元素但不返回其值 q.push(); //将元素压入队列 q.back(); //返回队尾元素的值但不删除该元素
分析思路
要求实现一个特殊的栈。在实现栈的基本功能基础上,再实现返回栈中最小值元素的操作。调用min、push、pop时间复杂度都是O(1)。建一个辅助的Min栈。
1.压栈:①Min栈的push操作为,如果Min栈为空或者新值比Min栈顶小,将数值压栈到Min;否则,Min栈顶为最小,重复压栈Min栈顶。②Data数据栈压栈
2.出栈:最小值和数据栈各自出栈
3:min:Min的栈顶则为最小值的栈
代码实现
1.题目要求的功能
class Solution {
public:
void push(int value) {
}
void pop() {
}
int top() {
}
int min() {
}
};
2.实现代码
class Solution {
public:
void push(int value) {
//如果Min栈为空或者新值比Min栈顶小,压栈到Min
if(Min.size()==0)
Min.push(value);
else if(value < Min.top())
Min.push(value);
//否则重复压栈Min栈顶
else
Min.push(Min.top());
//压栈Data
Data.push(value);
}
void pop() {
if(Data.size()==0)
cout<<"Your stack is empty"<<endl;
Min.pop();
Data.pop();
}
int top() {
if(Data.size()==0)
cout<<"Your stack is empty"<<endl;
return Data.top();
}
int min() {
if(Min.size()==0)
cout<<"Your stack is empty"<<endl;
return Min.top();
}
private:
stack<int> Data; //数据栈
stack<int> Min; //最小栈
};