数据结构:栈(stack容器)使用详解

一、栈的基本概念

1. 栈的基本定义

栈(stack)又名堆栈,是一种只允许在同一端进行数据插入和删除操作的特殊线性表。

2.栈的相关概念

  • 栈顶(top):表尾,栈中允许进行数据插入和删除的一端。
  • 栈底(bottom):表头,栈中不允许进行数据操作的一端。
  • 入栈或进栈(push):将数据插入栈顶。
  • 出栈或退栈(pop):将数据取出栈顶并删除。
  • 栈上溢(full):栈内空间已满时,仍进行入栈操作,是一种空间不足的出错状态。
  • 栈下溢(empty):栈内无数据时,仍进行出栈操作,是一种数据不足的出错状态。
  • 空栈:元素个数为零的栈。

3.栈的常用操作

  • stack < Type > s:构造stack容器。
  • s.top():返回栈顶元素。
  • s.size():返回栈的大小。
  • s.empty():判断栈是否为空。
  • s.push(elem):入栈操作,向栈顶插入一个元素。
  • s.pop():出栈操作,取出并删除栈顶元素。

二、栈的操作应用

UVA514 铁轨 Rails

题目链接:UVA514 铁轨 Rails

题目描述

Alt

输入格式

Alt

输出格式

alt

题目翻译

某城市有一个火车站,铁轨铺设如图。有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。你的任务是判断是否能让他们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。
为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每节车厢,一旦从A移入C,就不能返回A了;一旦从C移入B,就不能返回C了。也就是说,在任意时刻,只有两种选择:A到C和C到B。

题目分析

观察发现,对火车进行调度的整个过程实际是在模拟入栈出栈的过程,令A表示下一个进栈元素, T a r g e t B Target_B TargetB表示下一个预期出栈元素,则存在以下情况:

  1. A= T a r g e t B Target_B TargetB,则A入栈后应立即出栈,AB均增加一位。
  2. 栈非空且s.top()= T a r g e t B Target_B TargetB,则栈顶元素出栈,B增加一位。
  3. A<=n,说明仍有元素等待入栈且当前A或栈顶元素并非当前期望元素,则当前A入栈,A增加一位。
  4. 以上情况均不满足,则说明所有元素均已入栈且栈顶元素不为期望元素,则无法满足条件,无解。

Code

#include<cstdio>
#include<stack>//stack为stl特有容器,使用时需引用stack库
using namespace std;
const int MAXN=1000+10;
int n,Target[MAXN];
int main()
{
	while(~scanf("%d",&n) && n!=0)
	{
		while(~scanf("%d",&Target[1]) && Target[1]!=0)
		{
			stack<int>s;
			int A=1,B=1,ok=1;
			for(int i=2;i<=n;i++) scanf("%d",&Target[i]);
			while(B<=n){
			if(A==Target[B])
			{
				A++;
				B++;
			}
			else if(!s.empty() && s.top()==Target[B])
			{
				s.pop();
				B++;
			}
			else if(A<=n)
			{
				s.push(A);
				A++; 
			}
			else
			{
				ok=0;
				break;
			} 
		}
		printf("%s\n",ok?"Yes":"No");
		}
	}
	return 0;
}

以上就是C++中栈(stack容器)使用详解的全部内容了,如果您认为我的文章对您起到了帮助作用,恳请点赞关注支持一下,您的鼓励就是我前进的最大动力。
我是Horseman:一名正在成长的蒟蒻OIer,算法竞赛系列教程持续更新中,感谢大家的鼓励支持。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值