c++洗盘子 栈

Posted nameQWQ_CSDN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++洗盘子 栈相关的知识,希望对你有一定的参考价值。

以较为通俗,容易理解的语言让人听懂;以较为完整,仔细详细的语言让人理解

我是nameQWQ_CSDN.

废话不多说(废话),切入正题。

题目描述

洗盘子

Bessie 和 Canmuu 将联手洗掉N (1<= N< = 10,000) 个脏盘子。Bessie 负责洗盘子,Canmuu 来擦干它们。

     每个盘子有一个指定的编号,范围1..N。开始,所有盘子按顺序排列在栈中, 1号盘子在顶端,N号盘子在底端。

    Bessie会先洗一些盘子,然后放在洗过的盘子栈里(这样原来的顺序颠倒)。然后Canmuu擦干Bessie已经洗好的部分或全部的盘子,放在擦干的盘子栈里。然后,Bessie再洗一些盘子,Canmuu再擦干一些她已经洗好盘子,直到所有盘子洗完擦干,这时盘子放置的顺序是什么?

比如,有1,2,3,4,5号盘子,先洗3个,然后擦2个,再洗2个,再擦3个,最后盘子的序列是1,4,5,2,3。

输入

第一行: 一个整数N,表示盘子的数量

以下若干行: 每一行两个整数 ,第一整数为1表示洗盘子,为2表示擦盘子,第二个整数表示数量


 

输出

共N行:擦干后盘子从顶端到底端的顺序


 

样例输入 

5
1 3
2 2
1 2
2 3

样例输出 

1
4
5
2
3

代码及详细解释

#include <bits/stdc++.h>
using namespace std;
stack<int>a;//定义一个栈a,在此题中用来存储脏盘子; 
stack<int>b;//定义一个栈b,在此题中用来存储洗过的盘子 ; 
stack<int>c;//定义一个栈c,在此题中用来存储擦过的盘子 ; 
int main()
{
    
    int n,x,y;
    cin>>n;//输入盘子个数; 
    for(int i=n;i>0;i--)//顺序倒置,原本应是1在栈底,n号在栈顶,现在通过这个来倒置 
    {
    	a.push(i);//将盘子按n,n-1,n-2...3,2,1顺序存放,n号在栈底,1号在栈顶 ; 
	}
    while(cin>>x>>y) //输入两个数 
    {
        if(x==1)//若为洗盘子 
        {
            while(y--)//则y一直减减,直到为0,比如若y为3,则要洗3个盘子,那么洗1个就少一个(即y--),直到洗完停止 ; 
            {
                b.push(a.top());//将a栈栈顶(即洗完的盘子)放入b栈中 ; 
                a.pop();//放在b栈中之后,a栈应当没有这个盘子了,所以弹栈 (将旧栈顶弹走),形成新的栈顶 ; 
            }
        }
        else if(x==2)//若为擦盘子 
        {
            while(y--)//则y一直减减,直到为0 ,比如若y为2,则要擦2个盘子,那么擦1个就少一个(即y--),直到擦完为止 ; 
            {
                c.push(b.top());//将b栈栈顶(即擦完的盘子)放入c栈中 ;
                b.pop();//放在c栈中之后,b栈应当没有这个盘子了,所以弹栈 (将旧栈顶弹走),形成新的栈顶 ; 
            }
        }
        if(c.size()==n) break;//当 擦过的盘子个数等于盘子总数时,不再擦盘子和洗盘子; 
    }
    while(!c.empty())//c栈不空时一直循环 
    {
        cout<<c.top()<<endl;//从栈顶开始输出盘子顺序 
        c.pop();//输出完弹栈(将旧栈顶弹走),形成新的栈顶 
    }
    return 0;
}

此代码由xxx人的代码借鉴而来,不过却是忘了此人大名,若知道,我定会感谢他啊!

以上是关于c++洗盘子 栈的主要内容,如果未能解决你的问题,请参考以下文章

c++洗盘子 栈

c++洗盘子 栈

javascript数据结构与算法——栈

PV操作与c++代码实现爸爸放苹果,妈妈放桔子,两个儿子专吃盘子中桔子,两个女儿专吃盘子中苹果问题

用栈模拟汉诺塔问题

51nod 1279单调栈扔盘子