编程之美:队列中的最大最小值
2015-01-03 11:09 MengYu1 阅读(373) 评论(0) 编辑 收藏 举报#include "iostream" #include "memory.h" #include "stdio.h" #include "limits.h" typedef int Type; const int MAXN=15; const int MIN=INT_MIN; class stack { public: stack() { stacktop=-1; maxItemIndex=-1; } void push(Type x) { ++stacktop; if (stacktop>=MAXN) ; else { stackItem[stacktop]=x; if (x>maxItem()) { link2NextMaxItem[stacktop]=maxItemIndex; maxItemIndex=stacktop; } else link2NextMaxItem[stacktop]=-1; } } Type pop() { if (stacktop<0) ; else { Type x=stackItem[stacktop]; if (maxItemIndex==stacktop) { maxItemIndex=link2NextMaxItem[stacktop]; } --stacktop; return x; } } Type maxItem() { if (maxItemIndex>=0) { return stackItem[maxItemIndex]; } else return MIN; } Type empty() { return stacktop==-1; } private: Type stackItem[MAXN]; Type link2NextMaxItem[MAXN]; Type maxItemIndex; Type stacktop; }; class Queue { public: inline Type max(Type x,Type y) { return x>y?x:y; } Type deque() { if (stackOut.empty()) { while (!stackIn.empty()) stackOut.push(stackIn.pop()); } return stackOut.pop(); } void inque(Type x) { stackIn.push(x); } Type maxItem() { return max(stackIn.maxItem(),stackOut.maxItem()); } private: stack stackIn,stackOut; }; int main(int argc, char const *argv[]) { Queue q; q.inque(3); printf("%d\n", q.maxItem()); q.inque(2); printf("%d\n", q.maxItem()); q.deque(); q.inque(1); printf("%d\n", q.maxItem()); stack s; s.push(3); printf("%d\n", s.maxItem()); s.push(2); printf("%d\n", s.maxItem()); s.pop(); s.push(1); printf("%d\n", s.maxItem()); return 0; }
push(Type x) { ++stacktop; if (stacktop>=MAXN) ; else { stackItem[stacktop]=x; if (x>maxItem()) { link2NextMaxItem[stacktop]=maxItemIndex; maxItemIndex=stacktop; } else link2NextMaxItem[stacktop]=-1; } } Type pop() { if (stacktop<0) ; else { Type x=stackItem[stacktop]; if (maxItemIndex==stacktop) { maxItemIndex=link2NextMaxItem[stacktop]; } --stacktop; return x; } } Type maxItem() { if (maxItemIndex>=0) { return stackItem[maxItemIndex]; } else return MIN; } Type empty() { return stacktop==-1; } private: Type stackItem[MAXN]; Type link2NextMaxItem[MAXN]; Type maxItemIndex; Type stacktop; }; class Queue { public: inline Type max(Type x,Type y) { return x>y?x:y; } Type deque() { if (stackOut.empty()) { while (!stackIn.empty()) stackOut.push(stackIn.pop()); } return stackOut.pop(); } void inque(Type x) { stackIn.push(x); } Type maxItem() { return max(stackIn.maxItem(),stackOut.maxItem()); } private: stack stackIn,stackOut; }; int main(int argc, char const *argv[]) { Queue q; q.inque(3); printf("%d\n", q.maxItem()); q.inque(2); printf("%d\n", q.maxItem()); q.deque(); q.inque(1); printf("%d\n", q.maxItem()); stack s; s.push(3); printf("%d\n", s.maxItem()); s.push(2); printf("%d\n", s.maxItem()); s.pop(); s.push(1); printf("%d\n", s.maxItem()); return 0; }
代码与思路见原书236页
简单的来说:求队列中的最大值过程由两部分组成
1.求取栈的最大值
2.用栈模拟队列