栈与队列三题

作弊的发牌者:

贝茜正在与她的N-1(2 <= N <= 100)个朋友打牌。她们玩的牌一副为K(N <= K <= 100,000,K为N的倍数)张。所有牌中,一共有M(M = K / N)张“好

牌”,其余的K - M张为“差牌”。

贝茜是游戏的发牌者,很自然地,她想把所有好牌都留给自己。她热衷于获胜,即使为此必须采取一些不正当的手段。

在若干局游戏后,贝茜的朋友们开始怀疑贝茜在游戏中作弊,于是她们想了个对策:使用新的发牌规则。规则具体如下:

  1. 贝茜把牌堆的最上面一张发给她右边的奶牛
  1. 每当贝茜发完一张牌,她都得将牌堆顶部接下来的P(1 <= P <= 10)张牌 放到底部去(一般把这个操作称为切牌)
  1. 然后,贝茜对逆时针方向的下一头奶牛重复上述的操作

贝茜绝望地认为,她再也不可能获胜了,于是她找到了你,希望你告诉她,将好牌放在初始牌堆的哪些位置,能够确保它们在发完牌后全集中到她手里。顺带说明一下,我们把牌堆顶的牌定义为1号牌,从上往下第二张定义为2号牌,依此类推。

这题可以用队列来维护:

第一个操作移一次,第二个操作移p次就星

    for (int i=1;i<=m/n;i++)
     for (int j=1;j<=n;j++)
      {
      	if (j==n)c[++ci]=a[h];
      	h++;
      	for (int k=1;k<=p;k++)
      	 {
      	 	a[++t]=a[h];
      	 	h++;
      	 }
      }

火车进站

有一个车站,每天都会有N辆车进站,进站按从1到N的顺序进站。现在车站的站长想让这些火车按照特定的顺序出站,问可以做到吗?

当N为5时,出站顺序若为1 2 3 4 5,可以做到,但是顺序若为5 4 1 2 3,则不行。

我们可以把火车进站就是压栈,出站则是弹栈。

扫描二维码关注公众号,回复: 1099509 查看本文章

这题是栈的模板题(这NM还能不是栈的模板题,题面都说了)

随便开三个栈就行了

		while (yt<=n)
		 {
		 	if (sta[st]==zzstack[t])
		 	 {
		 	 	st++;
		 	 	t--;
		 	 }
		 	else
		 	 {
		 	 	t++;
		 	 	zzstack[t]=ysstack[yt];
		 	        yt++;
		 	 }
		 }

括号匹配

一个表达式中包括变量、常量、操作符、圆括号,圆括号可以嵌套, 编写程序判断表达式中的括号是否正确匹配。输入任意一个表达式,判断其中括号是否匹配,匹配, 输出YES, 不匹配,输出NO。(表达式的长度小于50)

这个不一定要开栈,只需要开一个t,遇到左括号+1,遇到右括号-1,当t为负数,也就是右括号比左括号多时,就不匹配。如果处理完后t为0,则匹配,否则也不匹配。

    for (int i=0;i<s.size();i++)
      {
      	if (s[i]=='(') t++;
      	 else if (s[i]==')') t--; 
        if (t<0) return;
      }

猜你喜欢

转载自blog.csdn.net/fsl123fsl/article/details/80321554