计蒜客 数据结构 栈 模板倒水问题

来源:互联网 发布:免谷歌软件下载商店 编辑:程序博客网 时间:2024/05/24 22:44
//单调递减栈//题目://我们来看看这样一道题:地上从左到右竖立着 n 块木板,从 1 到 n 依次编号,(10,5,8,12,6)//如下图所示。我们知道每块木板的高度,在第 n 块木板右侧竖立着一块高度无限大的木板,//现对每块木板依次做如下的操作:对于第 i 块木板,我们从其右侧开始倒水,//直到水的高度等于第 i 块木板的高度,倒入的水会淹没 ai 块木板(如果木板左右两侧水的高度大于等于木板高度即视为木板被淹没),//求 n 次操作后,所有 ai 的和是多少。//如图上所示,在第 4 块木板右侧倒水,可以淹没第 5 块和第 6 块一共 2 块木板,a4 = 2。//例如 n = 5,每块木板高分别为 10,5,8,12,6。sum 记录最后的结果,初始为 0。//第 1 块木板高 10,栈为空,10 入栈;//第 2 块木板高 5,栈顶为 10,5 入栈;//第 3 块木板高 8,栈顶 5 比 8 小,删除栈顶,a2 为 3 - 2 - 1 = 0,sum = 0。此时栈顶为 10,8 入栈;//第 4 块木板高 12,栈顶 8 比 12 小,删除栈顶,a 3为 4 - 3 -1 = 0,sum = 0。此时栈顶为 10 比 12 小,继续删除栈顶,//a1 为 4 - 1 - 1 = 2,sum = 2。此时栈为空,12 入栈。//第 5 块木板高 6,栈顶为 12,把 6 加入栈中。//遍历结束后,栈不为空,依次删除栈顶,当前位置为 n + 1,栈顶是第 5 个元素 6,a5 为 6 - 5 - 1 = 0,sum = 2。//删除栈顶,此时栈顶是第 4 个元素 12,a 4为 6 - 4 - 1 = 1,sum = 3。此时栈为空,得到 sum 为 3,程序结束。#include<iostream>#include<cassert>using namespace std;class Node {public:    int id, height;};template<class Type> class Stack {private:    Type *urls;    int max_size, top_index;public:    Stack(int length_input) {        urls = new Type[length_input];        max_size = length_input;        top_index = -1;    }    ~Stack() {        delete[] urls;    }    bool push(const Type &element) {        if (top_index >= max_size - 1) {            return false;        }        top_index++;        urls[top_index] = element;        return true;    }    bool pop() {        if (top_index < 0) {            return false;        }        top_index--;        return true;    }    Type top() {        assert(top_index >= 0);        return urls[top_index];    }    bool empty() {        if (top_index < 0) {            return true;        } else {            return false;        }    }};int main() {    //n表示有n块木板,ans用来记录最后的结果    int n, ans = 0;    cin>>n;    //定义node类型的栈stack长度为n    Stack<Node> stack(n);    Node temp;    for(int i = 1; i <= n;i++){        //C++中->左侧一定是指针,.的左侧是实体        cin>>temp.height;        temp.id = i;         while(!stack.empty() && stack.top().height <= temp.height){            ans = ans + i - stack.top().id - 1;            stack.pop();        }        stack.push(temp);    }    while(!stack.empty()){       // stack.pop();         ans = ans + n + 1 - stack.top().id - 1;            stack.pop();    }   cout<<ans<<endl;    return 0;}

0 0
原创粉丝点击