数据结构铁轨问题_数据结构练习专题

下面我给大家带来一些数据结构的题,供大家欣赏:

(一)栈

铁轨

试题描述:

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

现在给你一种1到n的排列,请你判断是否是题目描述的一种可能,如果是请输出yes,否则输出no

输入:

两行,第一行有一个正整数n,表示有n节车厢,第二行有n个正整数,即1到n的一种排列,两两之间有一个空格分隔。

输出:

yes或者no

输入示例:

5

5 4 1 2 3

输出示例:

no

栈就好

#include #include#include#include

#define MAXN 100 + 10

using namespacestd;inta[MAXN],n;intmain()

{

memset(a,66,sizeof(a));

stacks;

scanf("%d",&n);for(int i=1;i<=n;i++)

scanf("%d",&a[i]);int A=1,B=1;bool book=true;while(B<=n)

{if(A==a[B])

{

A++;

B++;

}else if(!s.empty() && s.top()==a[B])

{

s.pop();

B++;

}else if(A<=n)

s.push(A++);else{

book=false;break;

}

}if(book)

printf("yes");elseprintf("no");//system("pause");

}

(优先队列)

阿格斯

试题描述:

你的任务是编写一个称为 Argus 的系统。该系统支持一个 Register 命令 Register Q_num Period,该命令注册了一个触发器,它每 Period 秒钟就会产生一次编号为 Q_nurn 的事件。你的任务是模拟出前k个事件。如果多个事件同时发生,先处理 Q_num 小的事件

输入:

前若干行是Register命令,以“#”结尾;最后一行是整数k。对于每条命令,1≤Q_num,Period≤3 000。k≤10 000。命令条数n不超过1 000。

输出:

输出k行,即前后个事件的Q_num

输入示例:

water 2 35

eat 1 76

drink 3 35

#

2

输出示例

2

3

#include #include#include

using namespacestd;structnode

{intnum;intdata;inttie;bool operator < (node a) const{if(a.tie==tie)return a.num

}

};

priority_queueq;intmain()

{char c[10010];while(cin>>c)

{if(c[0]=='#')break;

node a;

scanf("%d%d",&a.num,&a.data);

a.tie=a.data;

q.push(a);

}intk;

cin>>k;for(int i=1;i<=k;i++)

{

node a;

a.num=q.top().num;

a.data=q.top().data;

a.tie=q.top().tie+q.top().data;

printf("%d\n",q.top().num);

q.pop();

q.push(a);

}

}

数据结构结合:

试题描述:

你有一个类似“包包”的数据结构,支持两种操作,如下表所示。 1x:把元素x放进包包 2:从包包中拿出一个元素 给出一系列操作以及返回值,你的任务是猜猜这个“包包”到底是什么。它可能是一个栈

输入:

第一行为一个整数n(1≤n≤1 000)。以下n行每行要么是一条类型1的命令,要么是一条类型2的命令后面跟着一个整数x(1≤x≤100)。这个整数x表示执行完这条类型2的命令后,包包无错地返回了x。输入文件大小不超过1MB。

输出:

输出一行。一共有5种可能的输出。

stack:一定是一个栈

queue:一定是一个队列

priority queue:一定是一个优先队列

impossible:一定不是以上三种

not sure:至少有两种是可能的

输入示例:

5

1 5

1 3

1 2

2 2

2 3

输出示例:

stack

#include #include#include#include

using namespacestd;

queueq;

stacks;

priority_queue,less >pq;intmain()

{intn;

cin>>n;int qflag=1,sflag=1,pqflag=1;for(int i=1;i<=n;i++)

{inta,b;

scanf("%d%d",&a,&b);if(a==1)

{

q.push(b);

s.push(b);

pq.push(b);

}if(a==2)

{if(q.empty())

qflag=0;if(pq.empty())

pqflag=0;if(s.empty())

sflag=0;if(!q.empty() && q.front()!=b) qflag=0;else if(!q.empty()) q.pop();if(!pq.empty() && pq.top()!=b) pqflag=0;else if(!pq.empty()) pq.pop();if(!s.empty() && s.top()!=b) sflag=0;else if(!s.empty()) s.pop();

}

}int ans=qflag+pqflag+sflag;if(ans>1)

cout<

{if(qflag==1)

cout<

cout<

cout<

}if(ans==0)

cout<

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值