1.实现一个栈,要求实现push,pop,Min(返回最小值的操作)的时间复杂度为O(1)
算法思想:需要设计一个辅助栈,用来存储当前栈中元素的最小值。额外需要注意push操作,第一个元素不用比较,自动成为最小值入栈,其他元素每次都要和栈顶元素进行比较,小的入栈。
#include<iostream>
#include<stack> //直接用系统中的栈,不需要自己实现
using namespace std;
template<class T>
class Stack
{
public:
void push(const T& x)
{
_stack.push(x);
if (_minstack.empty())
{
_minstack.push(x);
}
else
{
if (x < _minstack.top())
{
_minstack.push(x);
}
else
{
_minstack.push(_minstack.top());
}
}
}
void pop()
{
_stack.pop();
_minstack.pop();
}
T Retmin()
{
return _minstack.top();
}
private:
stack<T> _stack;
stack<T> _minstack;
};
void test()
{
Stack<int> s;
int ret;
s.push(3);
s.push(2);
s.push(5);
s.push(1);
s.push(7);
s.pop();
s.pop();
ret = s.Retmin();
cout << "最小值是:" << ret << endl;
}
int main()
{
test();
return 0;
}
2.元素出栈入栈顺序的合法性检查
算法思想:用for循环将数组1中的元素入栈,每入栈一个与数组2中当前元素进行进行比较,如果相同就出栈,数组2中下一个元素作为当前元素。如果循环结束,而栈中还有元素,就说明数组2不是pop序列。
#include<iostream>
#include<stack>
using namespace std;
bool InvalidCheck(int* stack_in, int* stack_out, int len1, int len2)
{
stack<int> s;
if (len1 != len2)
{
return false;
}
int i = 0, j = 0;
for (i = 0, j = 0; i < len1; i++)
{
s.push(stack_in[i]);
while (s.size()>0 && s.top() == stack_out[j])
{
s.pop();
j++;
}
}
if (s.size() > 0)
return false;
else
return true;
}
int main()
{
int stack_in[] = { 1, 2, 3, 4, 5 };
int stack_out[] = { 4, 5, 1, 2, 3 };
int len1 = sizeof(stack_in) / sizeof(stack_in[0]);
int len2 = sizeof(stack_out) / sizeof(stack_out[0]);
bool ret = InvalidCheck(stack_in, stack_out, len1, len2);
if (ret)
{
cout << "出栈顺序合法!" << endl;
}
else
{
cout << "出栈顺序不合法!" << endl;
}
return 0;
}