快速得到栈、队列的最大值
生活随笔
收集整理的這篇文章主要介紹了
快速得到栈、队列的最大值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
特點
?!冗M后出
隊列——后進先出
思路
1. 快速得到最大值的棧
結構
操作
圖示
以入棧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;}elselink2NextMaxValueIndex[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];elsereturn 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. 快速得到最大值的隊列
兩個??梢詫崿F隊列(參考),就用剛才的棧實現隊列
代碼
#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;}elselink2NextMaxValueIndex[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];elsereturn -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; }結果
?
?
本文轉自jihite博客園博客,原文鏈接:http://www.cnblogs.com/kaituorensheng/p/3529942.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的快速得到栈、队列的最大值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 七、Mosquito 集群搭建
- 下一篇: gatekeeper学习概述