1.对顶栈
含义:设置两个数组,使栈顶对栈顶,从而进行插入,删除工作。
栈是先进后出结构
常用函数:top();取出栈顶
empty();判断栈是否为空。
push(x);将x入栈
pop();弹出栈顶
size();栈的存储元素个数
例题:
你将要实现一个功能强大的整数序列编辑器。
在开始时,序列是空的。
编辑器共有五种指令,如下:
1、I x
,在光标处插入数值 x。
2、D
,将光标前面的第一个元素删除,如果前面没有元素,则忽略此操作。
3、L
,将光标向左移动,跳过一个元素,如果左边没有元素,则忽略此操作。
4、R
,将光标向右移动,跳过一个元素,如果右边没有元素,则忽略此操作。
5、Q k
,假设此刻光标之前的序列为 a1,a2,…,an,输出 max1≤i≤kSi,其中 Si=a1+a2+…+ai。
输入格式
第一行包含一个整数 Q ,表示指令的总数。
接下来 Q 行,每行一个指令,具体指令格式如题目描述。
输出格式
每一个 Q k
指令,输出一个整数作为结果,每个结果占一行。
数据范围
1≤Q≤10^6,
|x|≤10^3,
1≤k≤n
输入样例:
8
I 2
I -1
I 1
Q 3
L
D
R
Q 2
输出样例:
2
3
样例解释
下图包含了对样例的过程描述:
例如:a数组现在为[1,2,3,4,5]. 光标在5的后面
光标左移一次:a=[1,2,3,4] ,b=[5].
光标左移两次:a=[1,2,3], b=[5,4].
光标右移一次:a=[1,2,3,4], b=[5].
即a,b对顶为
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+9;
int a[N],b[N];
int c[N],sum[N];
int i=0,j=0;
int main()
{
memset(sum,-1777777,sizeof(sum)); //给sum数组初始化为一个较小的值
int q;
cin>>q;
while(q--)
{
string ch;
cin>>ch;
if(ch=="I")
{
int x;
cin>>x;
a[++i]=x;
c[i]=c[i-1]+a[i]; //前缀和
sum[i]=max(c[i],sum[i-1]); //计算前缀和的最大值
}
else if(ch=="D")
{
if(i>0)
i--;
}
else if(ch=="L") //a的栈顶移动到b数组
{
if(i>0)
b[++j]=a[i--];
}
else if(ch=="R")
{
if(j>0)
{
a[++i]=b[j--]; //左边数字变化,前缀和需要再计算一次新加入的数,当然最大值同样需要再次比较
c[i]=c[i-1]+a[i];
sum[i]=max(c[i],sum[i-1]);
}
}
else if(ch=="Q")
{
int x;
cin>>x;
cout<<sum[x]<<endl;
}
}
return 0;
}