SDUST数据结构 - chap3 栈和队列

一、判断题:

 

 

 

 

 

 

 

 

 

 

 

二、选择题:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、编程题:

  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\n");
                flag2=0;
                break;
            }
        }
        if(flag2==1)//符合题目要求同时输出字符串也符合要求 
        {
            if(flag1==0)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
}
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]=='\0')//如果一上来就符合结束规定,退出循环 
            break;
        for(int i=0;test[i]!='\0';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\n");
        if(StackEmpty(S))
        {
            if(GetTop(S)=='(')
                printf("(-?\n");
            if(GetTop(S)=='{')
                printf("{-?\n");
            if(GetTop(S)=='[')
                printf("[-?\n");
            if(GetTop(S)=='*')
                printf("/*-?\n");
        }
        else
        {
            if(temp==')')
                printf("?-)\n");
            if(temp=='}')
                printf("?-}\n");
            if(temp==']')
                printf("?-]\n");
            if(temp=='*')
                printf("?-*/\n");
        }
    }
    else
        printf("YES\n");
}
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\n",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("\n");
            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
posted @ 2020-11-27 21:11  3cH0_Nu1L  阅读(121)  评论(0)    收藏  举报