实现一个栈,要求pop,push,Min,时间复杂度为O(1)
程序员文章站
2022-07-13 21:18:29
...
有两种方法。
方法一:
利用一个栈实现。思路如下:
1.入栈时,一次入两个元素,第一次入栈,直接元素入栈;第二次入栈,直接放最小的元素入栈。这样,栈顶元素永远是最小的,Min时,直接top(),就可以得到。
2.出栈时,一次出两个元素。
具体代码如下:
template <class T>
class Stack
{
public:
void Push(T data)
{
T tmp=data;
if(!s.empty())
{
tmp=s.top();//保存栈顶元素
}
s.push(data);
if(tmp < data)
s.push(tmp);
else
s.push(data);
}
void Pop()
{
s.pop();
s.pop();
}
T& GetMin()
{
return s.top();
}
private:
stack<T> s;
};
方法二
利用两个栈实现,栈S1存元素,栈S2存最小值。
具体思路如下:
1.入栈时,元素入S1,当有较小元素时,该元素再入一次S2。
2.出栈时,直接从S1出栈,当出栈元素和S2中栈顶元素相同时,此时S2也出栈。
2.求最小值时,S2的栈顶元素就是。
具体代码如下:
template <class T>
class Stack
{
public:
void Push(T data)
{
s1.push(data);
if(s2.empty())
s2.push(data);
else
{
if(s2.top()>data)
{
s2.push(data);
}
}
}
void Pop()
{
if(s1.top()==s2.top())
s2.pop();
s1.pop();
}
T& GetMin()
{
return s2.top();
}
private:
stack<T> s1,s2;
};
上一篇: String类的判断功能
下一篇: JAVA字符串中的一些坑
推荐阅读
-
实现一个栈,要求pop,push,Min,时间复杂度为O(1)
-
算法————双栈实现队列、双队列实现栈、实现一个栈Push(出栈)Pop(入栈)Min(返回最小值的操作)的时间复杂度为O(1)
-
浅谈Java如何实现一个基于LRU时间复杂度为O(1)的缓存
-
【每日一题】实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
-
实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值)的时间 复杂度为O(1)
-
O1的时间复杂度内实现栈的Push、Pop和min
-
实现一个出栈,入栈,返回最小值的操作的时间复杂度为O(1)的栈
-
实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)
-
实现一个栈,要求实现出栈,入栈,返回最小值的操作,时间复杂度为O(1)
-
实现一个栈,push、pop、求栈中最小值min的时间复杂度为O(1)