特點
棧——先進后出
隊列——后進先出
思路
1. 快速得到最大值的棧
結構
- 需要兩個數組:一個數組stackItem保存棧的元素,另一個數組link2NextMaxValueIndex保存下一個最大值的位置
- 兩個指針:一個為stackTop指向棧頂,另一個為maxValueIndex指向最大值的下標
操作
- 插入時:比較插入元素與最大值的大小,如果比最大值還大呢,link2NextMaxValueIndex指向原來最大值的位置(即maxValueIndex),而maxValueIndex變為現在插入元素的位置;否則link2NextMaxValueIndex指向-1
- 刪除時:刪除元素的位置出,如果maxValueIndex與當前位置相同,此時maxValueIndex為link2NextMaxValueIndex[satckTop]
- 返回棧的最大元素
圖示
以入棧2 7 1,出棧為例:
代碼
#include <iostream> #include <climits> #define MAX 100 using namespace std; class stack { public: stack() : stackTop(-1), maxValueIndex(-1) {} void push(int val); int pop(); int max(); int size() { return stackTop + 1; } int empty() { return stackTop < 0 ? 1 : 0; } private: int stackItem[MAX]; int link2NextMaxValueIndex[MAX]; int stackTop; int maxValueIndex; }; void stack::push(int val) { ++stackTop; if(stackTop == MAX) { cout << "The stack has been full!" << endl; return; } else { stackItem[stackTop] = val; if(max() < val) { link2NextMaxValueIndex[stackTop] = maxValueIndex; maxValueIndex = stackTop; } else link2NextMaxValueIndex[stackTop] = -1; } } int stack::pop() { int ret; if(stackTop == -1) { cout << "The stack is empty!" << endl; return -1; } else { ret = stackItem[stackTop]; if(stackTop == maxValueIndex) maxValueIndex = link2NextMaxValueIndex[stackTop]; --stackTop; return ret; } } int stack::max() { if(maxValueIndex >= 0) return stackItem[maxValueIndex]; else return INT_MIN; } int main() { stack s; cout << "s.empty():" << s.empty() << endl; s.push(3); s.push(4); cout << "s.top():" << s.pop() << endl; cout << "s.top():" << s.pop() << endl; cout << "s.top():" << s.pop() << endl; cout << "s.size():" << s.size() << endl; cout << "s.empty():" << s.empty() << endl; }
結果
2. 快速得到最大值的隊列
兩個棧可以實現隊列(參考),就用剛才的棧實現隊列
代碼
#include <iostream> #include <climits> #define MAX 100 using namespace std; class stack { public: stack() : stackTop(-1), maxValueIndex(-1) {} void push(int val); int pop(); int max(); int size() { return stackTop + 1; } int empty() { return stackTop < 0 ? 1 : 0; } private: int stackItem[MAX]; int link2NextMaxValueIndex[MAX]; int stackTop; int maxValueIndex; }; class queue { public: void enQueue(int val); int deQueue(); int size() { return stackIn.size() + stackOut.size(); } private: stack stackIn; stack stackOut; }; void stack::push(int val) { ++stackTop; if(stackTop == MAX) { cout << "The stack has been full!" << endl; return; } else { stackItem[stackTop] = val; if(max() < val) { link2NextMaxValueIndex[stackTop] = maxValueIndex; maxValueIndex = stackTop; } else link2NextMaxValueIndex[stackTop] = -1; } } int stack::pop() { int ret; if(stackTop == -1) { cout << "The stack is empty!" << endl; return -1; } else { ret = stackItem[stackTop]; if(stackTop == maxValueIndex) maxValueIndex = link2NextMaxValueIndex[stackTop]; --stackTop; return ret; } } int stack::max() { if(maxValueIndex >= 0) return stackItem[maxValueIndex]; else return -100; } void queue::enQueue(int val) { stackIn.push(val); } int queue::deQueue() { if(stackOut.empty() and !stackIn.empty()) { while(!stackIn.empty()) stackOut.push(stackIn.pop()); } return stackOut.pop(); } int main() { stack s; cout << "s.empty():" << s.empty() << endl; s.push(3); s.push(4); cout << "s.top():" << s.pop() << endl; cout << "s.top():" << s.pop() << endl; cout << "s.top():" << s.pop() << endl; cout << "s.size():" << s.size() << endl; cout << "s.empty():" << s.empty() << endl; queue q; q.enQueue(1); q.enQueue(2); q.enQueue(3); cout << "q.size()" << q.size() << endl; q.deQueue(); cout << "q.size()" << q.size() << endl; }
結果