数据结构:栈(stack)

本文介绍了栈这一线性表的特殊形式,它只允许在一端进行插入和删除操作,类似于球筒中的羽毛球。栈顶是进行操作的一端。栈在实际应用中有着重要作用,比如单调栈,用于保持元素的单调性。文中通过示例展示了如何利用单调栈找到数组中每个元素左侧最近的更小元素。在处理这类问题时,栈的特性使得能高效地找到符合条件的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只允许在一端进行插入或删除操作的线性表。首先,栈是一种线性表,但限定这种线性表只能在某一段进行插入和删除操作。简单来说就是像球筒中放羽毛球,只能在一端点拿出 球来,先进的球最后拿出来,后进的球先拿出来。

栈顶(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值