weixin_70701961 2022-05-23 22:45 采纳率: 62.5%
浏览 70
已结题

c语言这为什么运行不了啊

假设某火车站采用后进先出的模式。现有n列火车,调度人员给出火车进站的序列,并给出火车出站的序列,判断在这个调度要求能否实现,如果能实现写出火车进站、出站的操作序列。(栈) 输入:第一行为一个正整数N代表火车数量;第二行为N个字母,中间用空格分开,代表N个火车的进站顺序;第三行为N个字母,中间用空格分开,代表N个火车的离站顺序。输出:第一行输出0或1,0代表该调度无法实现,1代表可以实现;如果可以实现,请在第二行输出进站出站序列。表示进站时在字母后加上‘面’,出站加上‘out’。
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
//判断调度能否实现
int Judge(char a[],char b[],char c[],int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(b[j]==a[i]){
c[j]=i;
}
}
}
for(int i=0;i<n;i++){
for(int j=++i;j<n;j++){
if(c[i]<c[j]){
for(int k=++j;k<n;k++){
if(c[j]<c[k]){
break;
return 0;
}
}
}
}
}
return 1;
}

//定义栈
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;

//栈初始化
void Initstack(SqStack *S){
S->base=(char *)malloc(sizeof(char));
S->top=S->base;
S->stacksize=maxsize;
}

//入栈
void Push(SqStack *S,char a){
*S->top++=a;
}

//出栈
SqStack Pop(SqStack *S){
if(S->top!=S->base){
S->top--;
}
}

//输出顺序
char Print(char a[],char b[],int n){
SqStack *S;
Initstack(S);
int j=0;
for(int i=0;i<n;i++){
Push(S,a[i]);
printf("%c_in",a[i]);
while(b[j]==*S->top){
Pop(S);
printf("%c_out",b[i]);
j++;
}
}
}

//主函数
int main(){
int n,d;
scanf("%d",&n);
char a[n],b[n],c[n];
for(int i=0;i<n;i++){
scanf("%c",&a[i]);
}
for(int i=0;i<n;i++){
scanf("%c",&b[i]);
}
d=Judge(a[n],b[n],c[n],n);
printf("%d",d);
Print(a[n],b[n],n);
return 0;
}

img

  • 写回答

2条回答 默认 最新

  • 李林罡 2022-05-24 00:35
    关注

    简单改了下,出错的地方给你标出来了,具体逻辑需要你自己完善了,
    希望能帮到你

    /*
    假设某火车站采用后进先出的模式。
    现有n列火车,调度人员给出火车进站的序列,并给出火车出站的序列,
    判断在这个调度要求能否实现,如果能实现写出火车进站、出站的操作序列。
    (栈) 
    输入:
        第一行为一个正整数N代表火车数量;
        第二行为N个字母,中间用空格分开,代表N个火车的进站顺序;
        第三行为N个字母,中间用空格分开,代表N个火车的离站顺序。
    输出:
        第一行输出010代表该调度无法实现,1代表可以实现;
        如果可以实现,请在第二行输出进站出站序列。
        
        表示进站时在字母后加上‘面’,出站加上‘out’。
    */
    #include<stdio.h>
    #include<stdlib.h>
    #define maxsize 100
    //判断调度能否实现
    int Judge(char a[], char b[], char c[], int n)
    {
        int i,j,k;
        //数组a->{'A','B'}
        //数组b->{'B','A'}
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                if (b[j] == a[i])
                {
                    c[j] = i;
                }
            }
        }
        //数组c->{1,0}
        for (i = 0; i < n; i++)
        {
            for (j = ++i; j < n; j++)
            {
                // j=1  i=1 
                // c[1] < c[1]  不符合
                // j++ j=2 j<n? 不符合 
                // 退出 即这里的逻辑有问题 完全进不来 
                
                if (c[i] < c[j])
                {
                    for (k = ++j; k < n; k++)
                    {
                        if (c[j] < c[k])
                        {
                            break;
                            return 0;
                        }
                    }
                }
            }
        }
        return 1;
    }
    
    //定义栈
    typedef struct{
        char* base;
        char* top;
        int stacksize;
    } SqStack;
    
    //栈初始化
    void Initstack(SqStack* S)
    {
        S->base = (char*)malloc(sizeof(char));
        S->top = S->base;
        S->stacksize = maxsize; 
    }
    
    //入栈
    void Push(SqStack* S, char a)
    {
        *S->top++ = a;
    }
    
    //出栈
    SqStack Pop(SqStack* S)
    {
        if (S->top != S->base){
        S->top--;
    }
    }
    
    //输出顺序
    char Print(char a[], char b[], int n)
    {
        SqStack* S;
        Initstack(S);
        //数组a->{'A','B'}
        //数组b->{'B','A'}
        int i,j = 0;
        for (i = 0; i < n; i++)
        {
            Push(S, a[i]);// S top{'A'} 并且内部top++导致top指向下一个位置了 下一个位置的值*S->top是未知的 
            printf("%c_in", a[i]);
            while (b[j] == *S->top)// 'B' 与未知值 可能永远不相等 相当于false 
            {
                Pop(S);
                printf("%c_out", b[i]);
                j++;
            }
        }
    }
    
    //主函数
    int main()
    {
        int n, d;
        scanf("%d", &n);//第一行为一个正整数N代表火车数量 假如为 2 
        char a[n], b[n], c[n];
        //2for中的int i 提取出来做同一个声明即可
        int i;     
        for (i = 0; i < n; i++)
        {
            scanf("%c", &a[i]);//第二行为N个字母,中间用空格分开,代表N个火车的进站顺序; 假如为 A B 
            if(a[i]=='\n'){
                scanf("%c", &a[i]);//避免读到多余的\n    
            }
        }
        //数组a->{'A','B'}
         
        for (i = 0; i < n; i++)
        {
            scanf("%c", &b[i]);//第三行为N个字母,中间用空格分开,代表N个火车的离站顺序。假如 为 B A 
            if(b[i]=='\n'){
                scanf("%c", &b[i]);//避免读到多余的\n    
            }
        }
        //数组b->{'B','A'}
        
        //d=Judge(a[n],b[n],c[n],n); 
    ////// !!! 在c语言中 a[n] 表示的是数组a中的下标为n的那个元素,Juge里面需要接收的是整个数组而不是数组中的一个元素 
        d = Judge(a, b, c, n);
        printf("%d", d);
        //Print(a[n],b[n],n);// !!! 原因同上  
        Print(a, b, n);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 请选择合适的标签 5月4日
  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月23日

悬赏问题

  • ¥15 使用ESP8266连接阿里云出现问题
  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角