当提供巨大的输入时,中止在堆栈操作程序中调用错误

Abort called error in a program of stack operation when providing a huge input

本文关键字:堆栈 程序 错误 调用 操作 巨大 输入      更新时间:2023-10-16
//Stack Operation
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int> stack;
vector<int>::iterator it;
int maxptr=-1;
it=stack.begin();
int n;
cin>>n;
for(int i=0,q,x,c=0,count;i<n;i++)
{
cin>>q;
if(q==1)
{
cin>>x;
stack.push_back(x);
if(x>c)
{
count=maxptr;
maxptr=stack.size()-1;
c=x;
}
}
else if(q==2)
{
if(stack.back()==stack.at(maxptr))
{
maxptr=count;
}
stack.pop_back();
if(maxptr==-1)
{
c=0;
}
else if(stack.size()==0)
{
c=0;
}
else
{
c=stack.at(maxptr);
}
}
else if(q==3)
{
cout<<stack.at(maxptr)<<endl;
}        
}
}

上面的代码是执行 3 个查询的基本堆栈程序。 查询 1:在堆栈中推送元素。 查询 2:从堆栈中弹出最顶层的元素。 查询 3:从堆栈中当前存在的元素中查找堆栈中的最大元素。 我使用向量来实现代码,但问题是对于输入测试用例 1 和输入测试用例 2 等大输入,会给出中止称为错误。

您可以通过使用两个堆栈和对代码进行一些修改来解决它。 它将通过所有测试用例。

#include<cmath>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
vector<int> stack;
vector<int> maxele;
int maxptr=-1;
int n,ct;
cin>>n;
for(int i=0,q,x,c=0;i<n;i++)
{
cin>>q;
if(q==1)
{
cin>>x;
stack.push_back(x);
if(x>=c)
{
maxele.push_back(x);
maxptr=maxele.size()-1;
c=x;
}
}
else if(q==2)
{
if(stack.back()==maxele.back())
{
stack.pop_back();
maxele.pop_back();
maxptr=maxele.size()-1;
}
else 
{
stack.pop_back();
}
if(maxptr==-1)
{
c=0;
}
else if(stack.size()==0)
{
c=0;
}
else
{
c=maxele.at(maxptr);
}
}
else if(q==3)
{
cout<<maxele.at(maxptr)<<endl;
}        
}
}

此代码中调用的中止错误是由于边界情况引起的,即如果两个 相同的元素一个接一个地插入,然后由于查询 1 中的条件,即如果你在两个相同的元素上执行这个条件"if(x>c)",那么它不会让 maxptr 更新为"c=x"条件"if(x>c)"将变为假。