左神原书中所有代码是JAVA实现的,由于我常用C/C++,所以我根据书中思路将代码改成了C++实现,话不多说
题目及要求
要求实现一个特殊的栈,在原栈的基本功能基础上实现返回栈中最小元素的操作。
要求pop,push,和getMin的时间复杂度是O(1);可以使用现成的栈结构。
思路
两种考虑方式:主要原理还是依靠两个栈来完成 dataStack和minStack
1、在栈压入单个数据时,比较当前数据和minStack栈顶数据,如果当前数据小于栈顶数据,则将当前数据压入栈中,否则只将数据压入dataStack,而不压入minStack。
2、每次保存压入数据,如果下一个数据小于已保存的数据,则将数据更新,否则保存的数据不变,每次将当前数据压入dataStack,将已保存的数据压入minStack,这样可以确保压入minStack的数据为最小数据。
实现了第一种思路,具体可参考书籍
代码
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
class my_stack {
private:
stack<int> dataStack;
stack<int> minStack;
public:
void push(int val);
void pop();
int getMin();
};
void my_stack::push(int val)
{
dataStack.push(val);
if (minStack.empty() || val < minStack.top())
minStack.push(val);
}
void my_stack::pop()
{
int tmp = dataStack.top();
dataStack.pop();
if (tmp <= minStack.top())
minStack.pop();
}
int my_stack::getMin()
{
return minStack.top();
}
int main()
{
int a[] = { 3, 4, 5, 1, 2, 1 };
my_stack stack1;
for (int i = 0; i < 6; i++)
{
stack1.push(a[i]);
int tmp = stack1.getMin();
cout << tmp << endl;
}
getchar();
return 0;
}
//VS2015