数据结构都是工具。
本文先通过简略描述告诉大家什么是对顶栈,
然后我们来读题分析为什么要使用对顶栈这一数据结构。
一、什么是对顶栈?
描述:
大家都知道栈是一种后进先出(LIFO, Last in, First out.)的数据结构,
它至少提供两种操作:进栈和出栈。执行进出栈操作的一端叫栈顶,另一端叫栈低。
进栈和出栈操作都是O(1)的复杂度。
那么对顶栈顾名思义就是将两个栈的栈顶通过某种方式联系起来,从而实现特定的功能。
功能:
对顶栈能解决这样的问题:始终对一个序列的中部进行修改。
就本题而言,本体需要实现一个文本编辑器的光标功能,达到从光标部位插入字符,删除字符的效果。
二、题目分析
题目要求维护一个光标,支持以下操作:
①在光标位置前插入一个数x
②删除当前光标位置前一个数。
③光标左移。
④光标右移。
⑤查询前x个数的前缀和的最大值。
那么本体可以以光标为界限,光标左边的文本为一个栈(取名sL),右边的文本也为一个栈(取名sR),栈顶方向为光标所在地方。
那么上述操作可以转化为对对顶栈的操作。
但是题目还需要动态的查询光标前的最大前缀合,其实这也是一个经典的问题,
要查询光标前的最大前缀合,需要用一个结构保存历史上最大前缀合的信息。
一下为代码,其中有一个地方放了逻辑错误,特地指出
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring