//stackAPI.h #ifndef _STACK_API_H #define _STACK_API_H #define SIZE 100 #include <time.h> #include <stdlib.h> void createRandArr(int *randArr, int len); template<typename T, int size = SIZE> class myStack { private: T srcData[size]; T maxData[size]; T minData[size]; int topIndex; int maxIndex; int minIndex; public: myStack(): topIndex(0), maxIndex(0), minIndex(0){} bool isEmpty() const{ return(topIndex == 0);} bool isFull() const { return(topIndex == size);} const T& top() const; const T& max() const; const T& min() const; void push(const T& val); T pop(); }; void createRandArr(int *randArr, int len) { srand((int)time(0)); for (int i = 0; i < len; ++i) { randArr[i] = rand()%50; } } template<typename T, int size> const T& myStack<T, size>::top() const { if (isEmpty()) { printf("no data exist"); } return srcData[topIndex -1]; } template<typename T, int size> const T& myStack<T, size>::max() const { if (isEmpty()) { printf("no data exist"); } return maxData[maxIndex -1]; } template<typename T, int size> const T& myStack<T, size>::min() const { if (isEmpty()) { printf("no data exist"); } return minData[minIndex -1]; } template<typename T, int size> void myStack<T, size>::push(const T& val) { if (isFull()) { printf("full, no mem"); return; } srcData[topIndex++] = val; if (minIndex == 0) { minData[minIndex++] = val; } if (maxIndex == 0) { maxData[maxIndex++] = val; } T minVal = min(); T maxVal = max(); if (val < minVal) { minData[minIndex++] = val; } else { minData[minIndex++] = minVal; } if (val > maxVal) { maxData[maxIndex++] = val; } else { maxData[maxIndex++] = maxVal; } } template<typename T, int size> T myStack<T, size>::pop() { if (isEmpty()) { printf("no data exist"); return 0; } T retVal = srcData[--topIndex]; maxData[--maxIndex]; minData[--minIndex]; return retVal; } #endif //main.cpp #include "stackAPI.h" int main(int argc, char* argv[]) { int arr[10]; int len = sizeof(arr) / sizeof(int); int i; createRandArr(arr, len); myStack<int,100> stk; printf("src max min/n"); for (i = 0; i < len; ++i) { stk.push(arr[i]); printf("%d %d %d/n", stk.top(), stk.max(), stk.min()); } printf("/n"); while (!stk.isEmpty()) { printf("%d %d %d/n", stk.top(), stk.max(), stk.min()); stk.pop(); } return 0; }