只允许在一端进行插入或删除操作的线性表。首先,栈是一种线性表,但限定这种线性表只能在某一段进行插入和删除操作。简单来说就是像球筒中放羽毛球,只能在一端点拿出 球来,先进的球最后拿出来,后进的球先拿出来。
栈顶(top)为可以进行插入删除操作的一端。
定义栈:
int stk[N],tt;
插入
stk[++tt]=x;
删除
t--;
判断栈是否为空
if(tt>0) empty
else not empty;
单调栈
单调栈就是在栈先进后出性质的基础上,所有的元素都是严格递增或者严格递减的。
例如找到数组中左边距离某一元素最近的更小的数,如果没有则输出-1.
如果某一元素大于等于下一元素,那么这个元素永远不可能作为结果,所以我们要构造一个单调栈。对每一个元素压入栈时,如果栈顶元素大于等于这个元素,则把栈顶压出,直到栈顶比这个元素小,此时栈顶即为比这个元素小的距离这个元素最近的数.
for(int i=0;i<n;i++)
{
int x;
cin>>x;
while(tt&stk[tt]>=x)
tt--;
if(tt)
cout<<stk[tt]<<" ";
else
cout<<"-1";
stk[++tt]=x;
}