【星海随笔】数据结构实操

今天看了一个人写的数据结构讲解,代码可以,就是解释好差,看了一遍代码,才看懂他说的是啥。

https://blog.csdn.net/m0_64694079/article/details/128004935

第一题
C:士兵队列训练

题目描述:某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始1至2报数,凡报到2的出列,剩下的向小序号方向靠拢,再从头开始进行1至3报数,凡报到3的出列,剩下的向小序号方向靠拢,继续从头开始进行1至2报数······以后从头开始轮流进行1至2报数、1至3报数直到剩下的人数不超过三人为止。

输入格式:本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过10000。
输出格式:共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。

这道题最后我理解的是。
输入一个数字,比如20,生成一个1-20的列表,然后列表索引位不断除以2和3,剩下列表小于等于3个数字则停止。
打印出最后剩余的小于等于三的几个数字的编号。
但是要求需要多组数据,所以开头cin的while循环使用于全逻辑。后面的cin输入为每次列表的数量。例如1-20或者1-40.最后输出最后剩余的的是那几个数字。

输入样例:
2
20
40

输出样例:
1 7 19
1 19 37

解题思路:使用双向链表list和计数器cnt。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T,n;
    cin>>T;
    list<int> a;
    list<int>:: iterator it;
    while(T--)
    {
        a.clear();
        int k=2;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            a.push_back(i);
        }
        while(a.size()>3)
        {
            int cnt=1;
            for(it=a.begin();it!=a.end();)
            {
                if(cnt++%k==0)
                    it=a.erase(it);
                else
                {
                    it++;
                }   
            }
            k=(k==2?3:2);
        }
        for(it=a.begin();it!=a.end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
}

C++ 入栈出栈
遍历输入的str字符。有左括号就入栈,遇到右括号就弹出。
如果遇到右括号,且栈内是空,则输出false

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char CheckBracketsStack[105];
    
    while(cin>>CheckBracketsStack)
    {
        stack<char> s;
        bool isok=true;
        for(int i=0;i<strlen(CheckBracketsStack);i++)
        {
            if(CheckBracketsStack[i]=='(') 
                s.push(CheckBracketsStack[i]);
            else
            {
                if(s.empty()) 
                {
                    isok=false;
                }
                else
                {
                    s.pop();
                }
                 
            }
        }
        if(!s.empty()) isok=false;
        cout<<(isok?"YES":"NO")<<endl;
    }
}

简单的进栈出栈。不知道为什么题目介绍的这么复杂。
个人理解为:
输入必须是顺序输入。可以为1~n ,也可以为n~1。
如果错误则输出False,正确则输出yes。

题目:某城市有一个火车站,铁轨铺设如图。有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。

输入格式:输入由多组数据组成。对于每组数据,第1行一个整数N。接下来的若干行,每行N个数,代表1到N车厢的出站顺序,最后一行只有一个整数0。
最后一组数据“N=0”,输入结束,不输出答案。 (N<=1000)

输出格式:对每行的出栈顺序都单行输出“Yes”或“No”。对每组数据都在最后输出空行。


#include<bits/stdc++.h>
using namespace std;

int B[100000];

int main()
{
    int n,m;
    while(cin>>n&&n)
    {

        while(1)
        {
            int i=1,j=1;
            stack<int>s;
            cin>>B[1];
            if(!B[1]){
            	cout << "输出0:退出内循环" << endl;
                break;
        	}
			for(int i=2;i<=n;i++){
                cin>>B[i];
                cout << "入栈尾 B[" << i << "]:" << B[i] << endl; 
        	}
        	
			while(i<=n) //循环 ,直到 i+ 到 n 为止。 i j init : 1 
            {
            	cout << "xunHuai:" << i << endl; 
                if(i==B[j])
                {
                    i++;
                    j++;
                    cout << "未入栈1次:" << j << endl;
                }
                else
                {
                    cout << "入栈 i:" << i << endl; 
					s.push(i++); //i 不等于 B[j] , 则入栈。i + 1 
                }
				cout << "stop" << s.top() << endl;
                while(!s.empty()&&s.top()==B[j])
                {
                    j++;
                    s.pop();
                }
            }
            
            if(j==n+1)
                cout<<"Yes"<<endl;
            else
            {
                cout<<"No"<<endl;
            }
        }
        cout<<endl;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值