思路:
首先,建立3个栈,dataStack , minStack , maxStack 。
这里只说如何求出最小元素。
1.push() 将k插入dataStack中,如果minStack中没有数,则加入k;如果k比minStack.top()小,也加入k;否则对minStack不做操作。
2.pop() 如果两个栈的头元素相同,则一起取出;若不相同,则只取出dataStack。
3.min() 最小元素为minStack.top()
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stack>
using namespace std;
class STack
{
private:
stack<int> dataStack;
stack<int> minStack;
stack<int> maxStack;
public:
void push(int k)
{
dataStack.push(k);
if(minStack.empty())
{
minStack.push(k);
}
if(maxStack.empty())
maxStack.push(k);
else if(k<minStack.top())
{
minStack.push(k);
}
else if(k>maxStack.top())
maxStack.push(k);
}
void pop()
{
if(dataStack.top() == minStack.top())
{
minStack.pop();
}
if(dataStack.top() == maxStack.top())
maxStack.pop();
dataStack.pop();
}
int min()
{
return minStack.top();
}
int max()
{
return maxStack.top();
}
};
int main()
{
STack s;
s.push(4);
s.push(3);
s.push(7);
s.push(5);
s.push(6);
s.push(10);
s.push(1);
for(int i=0;i<7;i++)
{
printf("min:%d\n",s.min());
printf("max:%d\n",s.max());
s.pop();
}
return 0;
}