1. 程式人生 > 其它 >天天快樂程式設計集訓隊2021暑假訓練-0810-資料結構題解

天天快樂程式設計集訓隊2021暑假訓練-0810-資料結構題解

1.1214: 資料結構練習題――線性表操作

對陣列的相關操作
1.insert(插入)將要插入位置後的資料後移,並將當前賦值,長度+1
2.clear(清空),長度變為1
3.getelem(得到當前元素),直接下標訪問
4.delete(刪除),位置後的資料前移,長度-1
5.exit(退出),做為迴圈結束條件

#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
    //注意本題位置從1開始,所以這裡初始化為1
    int tot=1;
    string s;
    while(cin>>s,s!="exit")
    {
        if(s=="insert")
        {
            int n;
            cin>>n;
            while(n--)
            {
                int pos,x;
                cin>>pos>>x;
                //倒著
                for(int i=tot-1;i>=pos;i--)
                {
                    //當前的挪到後面
                    a[i+1]=a[i];
                }
                a[pos]=x;
                tot++;
            }
        }
        if(s=="getelem")
        {
            int pos;
            cin>>pos;
            cout<<a[pos]<<"\n";
        }
        if(s=="clear")
        {
            //注意本題位置從1開始,所以這裡初始化為1
            tot=1;
        }
        if(s=="delete")
        {
            int pos;
            cin>>pos;
            cout<<a[pos]<<"\n";
            //正著
            for(int i=pos;i<tot;i++)
            {
                //後一個為當前的
                a[i]=a[i+1];
            }
            tot--;
        }
    }
    return 0;
}

2.1218: 資料結構練習題――棧

1.push(壓入),把這個數字放入最後一個數後
2.top(頂),取出top-1這個數
3.pop(彈出),取出top-1,並把top減1
4.清空,把top置為0

#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
    int top=0;
    string s;
    while(cin>>s,s!="exit")
    {
        if(s=="push")
        {
            int x;
            cin>>x;
            a[top++]=x;
        }
        if(s=="top")
        {
            if(top == 0) cout<<"None\n";
            else cout<<a[top - 1]<<"\n";
        }
        if(s=="pop")
        {
            if(top==0) cout<<"None\n";
            else cout<<a[--top]<<"\n";
        }
        if(s=="clear")top=0;
    }
    return 0;
}

3.5487: 棧之應用

模擬下棧操作,每次都入棧,看待是否出棧

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

int main()
{
    int n;
    while(cin>>n)
    {
        string a,b;
        cin>>a>>b;
        //儲存答案序列
        string ans="";
        char st[10];
        int top=0;
        //初始化,均要進棧
        for(int i=0,j=0;i<n&&j<n;i++)
        {
            //a[i]進棧
            st[top++]=a[i];
            ans+="in\n";
            //棧有元素,去匹配
            while(top>0)
            {
                if(b[j]==st[top-1])
                {
                    j++,top--;
                    ans+="out\n";
                }
                else break;
            }
        }
        if(top>0)cout<<"No.\n";
        else cout<<"Yes.\n"<<ans;
        cout<<"FINISH"<<"\n";
    }
    return 0;
}

4.4368: 資料結構練習題----佇列的基本操作

1.設定隊首和隊尾
2.入隊,插入到最後一個元素後面
3.出隊,把佇列第一個元素刪除

#include<bits/stdc++.h>
using namespace std;
int front,tail;
int q[1005]; 
int main()
{
    string s;
    while(cin>>s)
    {
        if(s=="exit")break;
        if(s=="enq")
        {
            int x;
            cin>>x;
            q[tail++]=x;
        }
        if(s=="deq")
        {
            if(front>=tail)
            {
                cout<<"None\n";
                continue;
            }
            cout<<q[front++]<<"\n";
        }
        if(s=="printq")
        {
            if(front>=tail)
            {
                cout<<"None\n";
                continue;
            }
            cout<<q[front];
            for(int i=front+1;i<tail;i++)cout<<' '<<q[i];
            cout<<"\n";
        }
    }
    return 0;
}

5.2936: 小孩報數問題

6.6173: 相同行程查詢

結構體勉強可以過,這裡建議排序後二分

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct T{
    string c;
    int r;
    ll s[1005];
    int num;
}a[105];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].c>>a[i].r;
        for(int j=0;j<a[i].r;j++)cin>>a[i].s[j];
        a[i].num=0;
    }
    int k;
    cin>>k;
    while(k--)
    {
        ll id;
        cin>>id;
        for(int i=0;i<n;i++)
        {
            int flag=0;
            for(int j=0;j<a[i].r;j++)
            {
                if(a[i].s[j]==id)
                {
                    a[i].num+=1;
                    flag=1;
                    break;
                }
            }
            if(flag)break;
        }
    }
    int q;
    cin>>q;
    while(q--)
    {
        string x;
        cin>>x;
        int flag1=1;
        for(int i=0;i<n;i++)
        {
            
            if(a[i].c==x)
            {
                cout<<a[i].num<<endl;
                flag1=0;
            }
        }
        if(flag1)cout<<"0"<<endl;
    }
    return 0;
}

二分程式碼

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

struct xtxc{
    string s1;
    int t;
    string s[1005];
    int num;
}l[105];

//定義一個struct陣列,儲存所有的人
struct person{
    string name;
    string train;
}p[100005];
//寫排序函式
int cmp(person a,person b)
{
    //按照name的字典序排列
    return a.name<b.name;
}
string bs(int left, int right,string x){
    int mid=(left+right)/2;
    if(p[mid].name==x)
    {
        return p[mid].train;
    }
    else if(p[mid].name<x)
    return bs(mid+1,right,x);
    else
    return bs(left,mid-1,x); 
}

int main()
{
    ios::sync_with_stdio(false);
    //定義變數tot去儲存所有的人
    int tot=0;
    int n1, n2, n3;
    cin>>n1;
    for(int i=0;i<n1;i++)
    {
        cin>>l[i].s1>>l[i].t;
        for(int j=0;j<l[i].t;j++)
        {
            cin>>l[i].s[j];
            p[tot].name = l[i].s[j];
            p[tot].train = l[i].s1;
            tot++;
        }
        l[i].num=0;
    }
    //想要二分必須先有序
    sort(p,p+tot,cmp);
    cin>>n2;
    //b和c之後並不需要,我們可以不用陣列,比如直接用x
    string x;
    for(int i=0;i<n2;i++)
    {
        cin>>x;
        //先進行搜尋,搜尋返回下標或者train均可
        string train = bs(0,tot,x);
        //n1很小,可以直接遍歷
        for(int j=0;j<n1;j++)
        {
            if(train==l[j].s1)
            {
                l[j].num++;
            }
        }
    }
    cin>>n3;
    
    for(int i=0;i<n3;i++)
    {
        cin>>x;
        int flag=0;
        for(int j=0;j<n1;j++)
        {
            if(x==l[j].s1)
            {
                cout<<l[j].num<<endl;
                flag=1;
                break;
            }
        }
        //沒被標記就是沒有
        if(flag==0)
        cout<<"0"<<endl;
    }
}
大佬您太強了,還請多多指教哎