#include <iostream>
#include <memory.h>
using namespace std;
#include<stdio.h>
#define STACK_LEN 7
typedef struct
{
int data;
int min;
}stackitem;
typedef struct
{
stackitem data[STACK_LEN];
int top;
}stack;
void push(stack *s,int val)
{
s->data[s->top].data = val;
if(s->top > 0) // 保证栈顶元素中的min始终为当前栈中最小值
{
if(val < s->data[s->top-1].min) // 如果当前push进的元素小于栈中最小元素值
s->data[s->top].min = val; // 把当前元素置为栈中最小元素值
else
s->data[s->top].min = s->data[s->top-1].min;
}
else // 否则,不更新
s->data[s->top].min = val;
s->top++;
}
int pop(stack *s)
{
if(s->top-1 >= 0)
return s->data[--s->top].data;
else
return -1;
}
int min(stack*s)
{
if(s->top-1 >= 0)
return s->data[s->top-1].min;
else
return -1;
}
int main(int argc,char *argv[])
{
stack s;
memset(&s,0,sizeof(s));
push(&s,5);
push(&s,2);
push(&s,1);
push(&s,3);
push(&s,7);
push(&s,9);
printf("pop: %d\n",pop(&s));
printf("min: %d\n\n",min(&s));
printf("pop: %d\n",pop(&s));
printf("min: %d\n\n",min(&s));
printf("pop: %d\n",pop(&s));
printf("min: %d\n\n",min(&s));
printf("pop: %d\n",pop(&s));
printf("min: %d\n\n",min(&s));
printf("pop: %d\n",pop(&s));
printf("min: %d\n\n",min(&s));
return 0;
}
/*
class C_Overflow {};
template<typename T, int MAX_SIZE = 10>
class C_MinStack
{
public:
C_MinStack();
bool IsEmpty() const { return nCurLen == 0; }
bool IsFull() const { return nCurLen == MAX_SIZE; }
int GetSize() const { return nCurLen; }
const T& Top() const;
const T& GetMin() const;
int Push(const T& val);
T Pop();
private:
T arrAllItem[MAX_SIZE];
int arrMinIndex[MAX_SIZE];
int nCurLen;
int nCurMinPos;
};
template<typename T, int SIZE>
C_MinStack<T, SIZE>::C_MinStack():nCurLen(0),nCurMinPos(0) {}
template<typename T, int SIZE>
const T& C_MinStack<T, SIZE>::Top() const
{
if (IsEmpty())
{
throw C_Overflow();
}
return arrAllItem[nCurLen - 1];
}
template<typename T, int SIZE>
const T& C_MinStack<T, SIZE>::GetMin() const
{
if (IsEmpty())
{
throw C_Overflow();
}
return arrAllItem[arrMinIndex[nCurMinPos - 1]];
}
template<typename T, int SIZE>
int C_MinStack<T,SIZE>::Push(const T& val)
{
if (IsFull())
{
throw C_Overflow();
}
if (IsEmpty() || val < GetMin())
{
arrMinIndex[nCurMinPos++] = nCurLen;
}
arrAllItem[nCurLen++] = val;
return nCurLen;
}
template<typename T, int SIZE>
T C_MinStack<T, SIZE>::Pop()
{
if (IsEmpty())
{
throw C_Overflow();
}
T retVal = arrAllItem[--nCurLen];
if (nCurLen == arrMinIndex[nCurMinPos-1])
{
nCurMinPos--;
}
return retVal;
}
int main(int argc, char * argv[])
{
C_MinStack<int> objStack;
objStack.Push(2);
objStack.Push(4);
objStack.Push(8);
objStack.Push(6);
objStack.Push(12);
objStack.Push(10);
objStack.Push(15);
objStack.Push(1);
cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() << endl;
objStack.Pop();
cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() << endl;
objStack.Pop();
cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() << endl;
objStack.Pop();
cout << "Stack size is: " << objStack.GetSize() << ",Min value is: " << objStack.GetMin() << endl;
return 0;
}
*/