题目:
实现一个栈,要求实现push(出栈)、pop(入栈)、getMin(返回最小值)的时间复杂度为O(1)
基本思路:
(1)建立两个栈,一个栈用于存储原始数据originalStack,另一个用于存储最小值数据minStack
(2)压入数据时,originalStack直接压入数据value
对于minStack有两种实现方法
方法一:
每次都压入原始数据栈中的最小值,该方法minStack压入费空间,弹出省时间
方法二
原始栈中若有更小值出现则压入minStack,否则不做操作,该方法minStack压入省空间,弹出费时间
代码实现
方法一:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
template <typename T>
class GetMinstack
{
private:
stack<T> originalStack; //存储原本数据
stack<T> minStack; //存储最小值数据
public:
void push(T value)
{
originalStack.push(value);
if (minStack.empty()) //最小栈也为空,则直接将值压入栈中
{
minStack.push(value);
}
else
{
if (value <= minStack.top())
{
minStack.push(value);
}
else
{
minStack.push(minStack.top());
}
}
}
void pop()
{
originalStack.pop();
minStack.pop();
}
T getMin()
{
if (minStack.empty())
{
cout << " 最小栈为空! " << endl;
return 0;
}
return minStack.top();
}
stack<T> getOriginalStack()
{
return originalStack;
}
stack<T> getMinStack()
{
return minStack;
}
};
template <typename T>
void toString(stack<T> s)
{
int len = s.size();
cout << "[";
for (int i = 0; i < len; i++)
{
if (i != len - 1)
{
cout << s.top() << ", ";
s.pop();
}
else
{
cout << s.top() << "]" << endl;
s.pop();
}
}
}
int main()
{
GetMinstack<double> s;
string flag;
while (true)
{
cout << "请输入您要存入的数字(输入'quit'结束):";
cin >> flag;
if (flag == "quit")
break;
double num = atof(flag.c_str());
s.push(num);
cout << "存入数字结果展示:" << endl;
cout << "数据栈:";
toString(s.getOriginalStack());
cout << "最小栈:";
toString(s.getMinStack());
cout << "数据栈最小值:" << s.getMin() << endl;
cout << endl;
}
return 0;
}
方法二:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
template <typename T>
class GetMinstack
{
private:
stack<T> originalStack; //存储原本数据
stack<T> minStack; //存储最小值数据
public:
void push(T value)
{
originalStack.push(value);
if (minStack.empty()) //最小栈也为空,则直接将值压入栈中
{
minStack.push(value);
}
else
{
if (value < minStack.top())
{
minStack.push(value);
}
}
}
void pop()
{
if (originalStack.top() == minStack.top())
minStack.pop();
originalStack.pop();
}
T getMin()
{
if (minStack.empty())
{
cout << " 最小栈为空! " << endl;
return 0;
}
return minStack.top();
}
stack<T> getOriginalStack()
{
return originalStack;
}
stack<T> getMinStack()
{
return minStack;
}
};
template <typename T>
void toString(stack<T> s)
{
int len = s.size();
cout << "[";
for (int i = 0; i < len; i++)
{
if (i != len - 1)
{
cout << s.top() << ", ";
s.pop();
}
else
{
cout << s.top() << "]" << endl;
s.pop();
}
}
}
int main()
{
GetMinstack<double> s;
string flag;
while (true)
{
cout << "请输入您要存入的数字(输入'quit'结束):";
cin >> flag;
if (flag == "quit")
break;
double num = atof(flag.c_str());
s.push(num);
cout << "存入数字结果展示:" << endl;
cout << "数据栈:";
toString(s.getOriginalStack());
cout << "最小栈:";
toString(s.getMinStack());
cout << "数据栈最小值:" << s.getMin() << endl;
cout << endl;
}
return 0;
}
这里还发现了一个以前一直不知道的地方,当函数的参数是栈的时候,该种传参方式竟然是值传递