数据结构-对顶栈

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;
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值