• SDUST数据结构


    一、判断题:

     

     

     

     

     

    二、选择题:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    三、编程题:

      7-1 一元多项式求导:

    输入样例:

    3 4 -5 2 6 1 -2 0

    输出样例:

    12 3 -10 1 6 0

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int a, b;
        int s = 0;//用于计算系数和幂的乘积
        cin>>a>>b;
        if(b != 0)
            cout<<(a*b)<<" "<<(b-1);//先计算一组,方便最后一组末尾的消除空格
        else//特殊情况:即多项式为常数的情况
        {
            cout<<"0 0";
            return 0;
        }
        while(scanf("%d %d", &a, &b) != EOF)//输入多组数据
        {
            if(b != 0)
            {
                s = a*b;
                cout<<" "<<s<<" "<<(b-1);//进行求导计算
            }
        }
        return 0;
    }
    View Code

      7-2 堆栈操作合法性:

    输入样例:

    4 10
    SSSXXSXXSX
    SSSXXSXXS
    SSSSSSSSSSXSSXXXXXXXXXXX
    SSSXXSXXX

    输出样例:

    YES
    NO
    NO
    NO

    代码:

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char s[101];
        int n, m;
        scanf("%d%d", &n, &m);//读入数据 
        for(int i=0;i<n;i++)//
        {
            scanf("%s",s);
            int len = strlen(s);//计算字符串长度 
            int flag1=0,flag2=1;
            for(int j=0;j<len;j++)
            {
                if(s[j] == 'S')//统计入栈的次数 
                    flag1++;
                else
                    flag1--;
                if(flag1<0||flag1>m)//若入栈次数小于零(出栈次数大宇入栈次数)或超出题目要球,均不符合 
                {
                    printf("NO
    ");
                    flag2=0;
                    break;
                }
            }
            if(flag2==1)//符合题目要求同时输出字符串也符合要求 
            {
                if(flag1==0)
                    printf("YES
    ");
                else
                    printf("NO
    ");
            }
        }
    }
    View Code

      7-3 符号配对:

    输入样例1:

    void test()
    {
        int i, A[10];
        for (i=0; i<10; i++) /*/
            A[i] = i;
    }
    .

    输出样例1:

    NO
    /*-?

    输入样例2:

    void test()
    {
        int i, A[10];
        for (i=0; i<10; i++) /**/
            A[i] = i;
    }]
    .

    输出样例2:

    NO
    ?-]

    输入样例3:

    void test()
    {
        int i
        double A[10];
        for (i=0; i<10; i++) /**/
            A[i] = 0.1*i;
    }
    .

    输出样例3:

    YES

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    //#define OVERFLOW -2
    #define STACK_INIT_SIZE 100
    #define OK 1
    char temp;//创建全局变量,供函数内判断和主函数判断共同使用。 
    typedef struct Stack// 
    {
        char *base;
        char *top;
        int stack_size;    
    }Stack;
    void InitStack(Stack &s)//初始化 
    {
        s.base = (char*)malloc(STACK_INIT_SIZE*sizeof(char));
        if(!s.base)
            exit (OVERFLOW);
        s.top = s.base;
        s.stack_size = STACK_INIT_SIZE;
    }
    char GetTop(Stack S)//取栈顶 
    {
        if(S.base != S.top)
            return *(S.top-1);
    }
    void Push(Stack &S, char e)//新元素入栈 
    {
        *S.top = e;
        *S.top ++;
    }
    bool StackEmpty(Stack &S)//判断占空 
    {
        if(S.base == S.top)
            return false;
        return true;
    }
    bool Pop(Stack &S)//删除栈顶 
    {
        if(S.base == S.top)
            return false;
        S.top --;
        return true;
    }
    bool StackCheck(Stack &S)//进行符号配对的判断 
    {
        
        char test[101];
        bool flag=true;
        while(cin>>test)
        {
            if(test[0]=='.'&&test[1]=='')//如果一上来就符合结束规定,退出循环 
                break;
            for(int i=0;test[i]!='';i++)//依次读入程序字符 
            {
                if(test[i]=='/'&&test[i+1]=='*')//当读到这俩个符号时,进行入栈操作,i提前一位 
                {
                    Push(S,test[i]),Push(S, test[i+1]);
                    i++;
                }
                else if(test[i]=='(' || test[i]=='{' || test[i]=='[')//当读到括号的前半部分时,仍然入栈 
                {
                    Push(S,test[i]);
                }
                else if(test[i]==']')
                {
                    if(StackEmpty(S)&&GetTop(S)=='[')//当读到】时,判断当前栈内是否有该括号的前半部分并且栈不空,若都成立, test[i]赋值给temp,退出循环 
                        Pop(S);
                    else
                    {
                        flag=false;
                        temp=test[i];
                        break;
                    }
                }
                else if(test[i]=='}')
                {
                    if(StackEmpty(S)&&GetTop(S)=='{')
                        Pop(S);
                    else
                    {
                        flag=false;
                        temp=test[i];
                        break;
                    }
                }
                else if(test[i]==')')
                {
                    if(StackEmpty(S)&&GetTop(S)=='(')
                        Pop(S);
                    else
                    {
                        flag=false;
                        temp=test[i];
                        break;
                    }
                }
                else if(test[i]=='*'&&test[i+1]=='/')
                {
                    if(StackEmpty(S)&&GetTop(S))
                    {
                        Pop(S);
                        if(StackEmpty(S)&&GetTop(S)=='/')
                        {
                            Pop(S);
                        }
                        else
                        {
                            flag=false;
                            temp=test[i];
                            break;
                        }
                    }
                    else
                    {
                        flag=false;
                        temp=test[i];
                        break;
                    }
                }
            }
        }
        if(!StackEmpty(S)&&flag)
            return true;
        else
            return false;
    }
    int main()
    {
        Stack S;
        InitStack(S);
        if(!StackCheck(S))//根据题目要求,进行输出 
        {
            printf("NO
    ");
            if(StackEmpty(S))
            {
                if(GetTop(S)=='(')
                    printf("(-?
    ");
                if(GetTop(S)=='{')
                    printf("{-?
    ");
                if(GetTop(S)=='[')
                    printf("[-?
    ");
                if(GetTop(S)=='*')
                    printf("/*-?
    ");
            }
            else
            {
                if(temp==')')
                    printf("?-)
    ");
                if(temp=='}')
                    printf("?-}
    ");
                if(temp==']')
                    printf("?-]
    ");
                if(temp=='*')
                    printf("?-*/
    ");
            }
        }
        else
            printf("YES
    ");
    }
    View Code

      7-4 表达式转换:

    输入样例:

    2+3*(7-4)+8/4

    输出样例:

    2 3 7 4 - * + 8 4 / +

    代码:

    //ceshi 
    //2+3*(7-4)+8/4
    #include<stdio.h>
    #include<string.h>
    int Judge_Numeric(char c)//数字处理 
    {
        int flag = ((c>='0'&&c<='9'));
        return flag;
    }
    int Judge_ZF(char c)
    {
        int flag = (c=='+' ||c=='-');
        return flag;
    }
    int Judge_CC(char c)
    {
        int flag;
        flag=(c=='*'||c=='/');
        return flag;
    }
    int main()
    {
        char a[31],b[31];
        scanf("%s",a);
        int flag1,flag2=0;
        int j=0;
        int len=strlen(a);
        for(int i=0;i<len;i++)
        {
            flag1=1;
            if(Judge_Numeric(a[i]))
            {
                if(flag2==0||(a[i-1]>='0'&&a[i-1]<='9')||a[i-1]=='.')
                    printf("%c",a[i]);
                else
                    printf(" %c",a[i]);
                flag2++;
            }
            if(a[i]=='.')     
            {
                printf("%c",a[i]);  
            }
            if(Judge_ZF(a[i]))
            {
                if(i==0)
                {
                    if(a[i]=='-')
                        printf("%c",a[i]);
                    flag1=0; 
                }
                else
                {
                    if(a[i-1]=='-'||a[i-1]=='+'||a[i-1]=='*'||a[i-1]=='/'||a[i-1]=='(')
                    {
                        if(a[i]=='-')
                        {
                            printf(" %c",a[i]);
                            flag2=0;
                        }
                        flag1=0;
                    }
                }
                if(flag1==1)
            {
                if(j==0)
                {
                    b[j]=a[i];
                    j++;
                }
                else if(b[j-1]=='+'||b[j-1]=='-'||b[j-1]=='(')
                    {
                        b[j]=a[i];
                        j++;
                    }
                else if(b[j-1]=='*'||b[j-1]=='/')
                {
                    while(j>0)
                    {
                        if(b[j-1]=='(')
                            break;
                        printf(" %c",b[j-1]);
                        j--;
                    }
                    b[j]=a[i];
                    j++;
                }
            }
            }
            if(Judge_CC(a[i]))
            {
                if(j==0)
                {
                    b[j]=a[i];
                    j++;
                }
                else if(b[j-1]||b[j-1]=='+'||b[j-1]=='-'||b[j-1]=='(')
                {
                    b[j]=a[i];
                    j++;
                }
            }
            if(a[i]==')')    
            {
                while(j>0)
                {
                    if(b[j-1]=='(')
                    {
                        j--;
                        break;
                    }
                    printf(" %c",b[j-1]);
                    j--;
                }
            }
             if(a[i]=='(')    
            {
                b[j]=a[i];
                j++;
            }
        }
        while(j>0)   
        {
            printf(" %c",b[j-1]);
            j--;
        }
    }
    View Code

      7-5 银行业务队列简单模拟:

    输入样例:

    8 2 1 3 9 4 11 13 15

    输出样例:

    1 3 2 9 11 4 13 15

    代码:

    #include<stdio.h>
    int main()
    {
        int a[1001];
        int b[1001];//开辟两个数组,用于存放到两个窗口的人数; 
        int N;
        int m = 0, n = 0;
        int flag = 0;
        scanf("%d",&N);
        for(int i = 0; i < N; i++)
        {
            int temp;
            scanf("%d",&temp);
            if(temp % 2 == 0)
            {
                b[n] = temp;
                n ++;
            }
            else
            {
                a[m] = temp;
                m ++;
            }
        }
        int m1 = 0, n1 = 0;
        while(m1 < m || n1 < n)
        {
            if(m1 < m)
            {
                if(flag++)
                {
                    printf(" ");
                    flag ++;
                }
                printf("%d", a[m1]);
                m1 ++;
                
            }
            if(m1 < m)
            {
                if(flag++)
                {
                    printf(" ");
                    //flag ++;
                }
                printf("%d", a[m1]);
                m1 ++;
                
            }
            if(n1 < n)
            {
                if(flag++)
                {
                    printf(" ");
                    //flag ++;
                }
                printf("%d", b[n1]);
                n1 ++;
            }
        }
        return 0;
    }
    View Code

      7-6 银行排队问题之单队列多窗口服务:

    输入样例:

    9
    0 20
    1 15
    1 61
    2 10
    10 5
    10 3
    30 18
    31 25
    31 2
    3

    输出样例:

    6.2 17 61
    5 3 1

    代码:

    #include<stdio.h>
    #include<string.h>
    typedef struct Q{
        int arrive;//到达时间 
        int deal;//处理时间 
    }Queue;
    Queue q[1010];
    int main()
    {
        //Queue q[1002];
        int head, tail;
        int n;
        int windows;
        int k;
        while(~scanf("%d", &n))
        {
            head = 0;
            tail = 0;//定义头和尾,队列的 
            for(int i=0;i<n;i++)
            {
                scanf("%d%d", &q[tail].arrive, &q[tail].deal);//讲数据读入队列 
                if(q[tail].deal > 60)
                    q[tail].deal = 60;
                tail++;//最大处理时间默认为60 
            }
            scanf("%d",&windows);//定义窗口数 
            int sum_wait_time=0;//总的等待时间 
            int wait_time=0;//最长等待时间 
            int wait=0;//个体等待时间 
            int finish_time[15]={0};//完成业务的人数 
            int windows_num[15]={0};//窗口人数 
            while(head < tail)
            {
                int flag=0;//做标记 
                int fastest=99999;//最快完成的时间 
                int index_fastest=0;//最快完成时间的下标 
                for(int j=0;j<windows;j++)//便利整个窗口 
                {
                    if(finish_time[j]<q[head].arrive)//如果队列首位,到达时间比,完成时间大,就代表不需要等待
                    {
                        finish_time[j]=q[head].arrive+q[head].deal;//更新时间 
                        windows_num[j]++;//窗口人数加一 
                        flag=1;//标记,表示不需要等待 
                        head++;//剔除首位 
                        break;
                    }
                    if(fastest>finish_time[j])//如果需要等待,就记录各个窗口里最快完成的那个窗口的完成时间,和下标
                    {
                        fastest = finish_time[j];
                        index_fastest=j;
                    }
                }
                if(!flag)//需要等待
                {
                    wait=fastest-q[head].arrive;
                    if(wait_time<wait)
                    {
                        wait_time = wait;
                    }
                    sum_wait_time+=wait;
                    finish_time[index_fastest]=fastest+q[head].deal;
                    windows_num[index_fastest]++;
                    head++;
                }    
            }
            int zuihou=0;
            for(k=0;k<windows;k++)
            {
                if(zuihou<finish_time[k])
                    zuihou = finish_time[k];//求最大完成时间
            }
            printf("%.1lf %d %d
    ",1.0*sum_wait_time/n,wait_time,zuihou);//输出,平均等待时间, 最长等待时间, 最后完成时间
            for(int i=0;i<windows;i++)
            {
                printf("%d",windows_num[i]);//输出各个窗口的人数
                if(i==windows-1)
                    printf("
    ");
                else
                    printf(" ");
            }
        }
        return 0;
    }
    View Code

      7-7 列车调度:

    输入样例:

    9
    8 4 2 5 3 9 1 6 7

    输出样例:

    4

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int arr[100001];//开辟数组并赋值
    int main()
    {
        int n;
        scanf("%d",&n);
        //int arr[100001]={0};//开辟数组并赋值 
        int a;
        int total=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a);
            if(total==0||arr[total-1]<a)//当前车辆比前面车辆大,开辟一条新路 
            {
                arr[total++] = a;
                //total ++;
            }
            else//当前车辆比前面车辆xiao,进一步判断跟前面的车还是跟其他比他大的车 
            {
                int head=0, tail=total-1;
                int mid;
                while(head<tail)//二分查找,找大于该车的车号最小的车 
                {
                    int mid=head+(tail-head)/2;
                    if(arr[mid]==a)
                        break;
                    else if(arr[mid]>a)
                        tail=mid-1;
                    else
                        head=mid+1;
                }
                arr[head] = a;
            }
        }
        printf("%d",total);
        return 0;
    }
    View Code
  • 相关阅读:
    python字符串格式化
    MFC----任务管理器的制作
    高斯消元方程组
    linux qq下载
    python——tuple元组
    Codeforces 515C. Drazil and Factorial
    HDU 1102 Constructing Roads (最小生成树)
    hdu 01背包汇总(1171+2546+1864+2955。。。
    HDU 3392 Pie(DP)
    HDU 1024
  • 原文地址:https://www.cnblogs.com/3cH0-Nu1L/p/14038704.html
Copyright © 2020-2023  润新知