#include <iostream> using namespace std; const int MAXLEN = 50; const int INF = 99999999; /* 构造一个队列,使front,push,getMaxElement都是O(1)时间 思路: 由于更新大小关系要考虑到后面的元素,如 1(1) 2(2) 此时来了个 3,则前面的最大元素都要改, 所以 用栈来保存元素间的大小关系比较合适 */ class stack { private: int NextMax[MAXLEN]; int maxElementIndex; int stackItem[MAXLEN]; int top; public: stack() { top = -1; maxElementIndex=-1; memset(NextMax,-1,sizeof(NextMax)); } int MaxElement() { if(top >=0 ) return stackItem[maxElementIndex]; else return -INF; } void push(int e) { top++; if( top >=MAXLEN) { cout<<"栈满"<<endl; } else { if( e > MaxElement() )//新加入的元素比 当前最大的大,则更新 { NextMax[top] = maxElementIndex;//把次大的记录下来 maxElementIndex = top; } else NextMax[top] = -1; } stackItem[top] = e; } bool empty() { return top<0; } int pop() { if(top<0) cout<<"空"<<endl; else { if(top == maxElementIndex ) { maxElementIndex = NextMax[top]; } return stackItem[top--]; } } }; //用两个栈来模拟队列 class queue { private: stack stackA; stack stackB; public: queue() { } int front() { if(stackB.empty()) { while(!stackA.empty()) { stackB.push(stackA.pop()); } } return stackB.pop(); } void push(int e) { stackA.push(e); } int getMaxElement() { return stackA.MaxElement() > stackB.MaxElement() ? stackA.MaxElement():stackB.MaxElement(); } }; int main() { queue q; q.push(10); q.push(2); q.push(9); cout<<"q.getMaxElement() = "<<q.getMaxElement()<<endl; cout<<"q.front() = "<<q.front()<<endl; cout<<"q.getMaxElement() = "<<q.getMaxElement()<<endl; q.push(15); cout<<"q.getMaxElement() = "<<q.getMaxElement()<<endl; system("pause"); return 0; } /* 设计包含min 函数的栈。 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。 要求函数min、push 以及pop 的时间复杂度都是O(1)。 思路: 两个栈A,B; A存实际元素,B存对应于A元素时当前的最小值是多少, A出栈,B也出栈, 元素 e, A进栈A.push(e),B则比较 当前栈顶元素c,与 e有大小关系, 如果c>e则 B.push(e),否则B.push(c); */