C语言 栈的应用 :火车的调度(软硬座)

栈的应用:火车调度问题概述

多参考,勿抄袭。

输入:第一行是一个整数 N,表示车厢的数量;

第二行是一个由Y与R组成的字符串,表示车厢的排列,

                                                                      其中Y表示硬座,R表示软座。

任务:借助一个栈,使得车厢的顺序变为软座在硬座前。

输出:是一个由I与O组成的字符串,代表栈的操作,I表示入栈,O表示出栈。

思路: 逐一读入火车字符串,遇到硬座,就把它入栈缓存,遇到软座,就先入栈,然后立刻出栈(相当于没有缓存),最后,当所有车厢被读入完毕,此时所有硬座都在栈内缓存,依次出栈直到栈空为止。

 // 火车调度 R是软座 Y 是硬座 
#include<stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int Position;
struct SNode {
    char *data;
    Position Top;
    int MaxSize;
};
typedef struct SNode *Stack;
Stack CreateStack( int MaxSize ) {
    Stack S=(Stack)malloc(sizeof(struct SNode));//开辟空间 
    S->data=(char*)malloc( MaxSize*sizeof(char));//开辟空间    注意那个char 如果你用int 还出现警告 
    S->Top=-1;
    S->MaxSize=MaxSize;
    return S;
}
void push(Stack S,char X) {//入栈 
    if(S->Top==(S->MaxSize-1)) {
        return ;
    }
    else {
        S->data[++(S->Top)]=X;
        return ;
    }
}
char Pop(Stack S) {//出栈 
    if(S->Top==-1) {
        return 0;
    }
    else {
        return (S->data[(S->Top)--]);
    }
}
int main(void)
{
    int n=0,i=0,j=0,k=0;//用于下面数组的下标 
    scanf("%d",&n);//输入你要弄的车节 
    Stack S ;
    S=CreateStack(n+1);//创建 
    char a[n],s[2*n],c[n];//a[n]是你输入每个车节的软硬字母 
	//s[]数组 用来记录 I O 的  I 即入栈 O 是出栈 ;
	// 
    scanf("%s",a);//输入字符串给数组a
	if(n < strlen(a)){//字符串数组的大小
		printf("你的输入超标了,只按n个进行操作\n");
	}
	if(n>strlen(a)){
		printf("输入错误,请重新来过!\n");
		return 0 ;
	}
    for(i=0;i<n;i++){//用循环 然后判断Y还是R 以便处理
    	if(a[i]=='Y'){
    	    push(S,a[i]);//入栈
    		s[j++]='I' ;//先将字符‘I’放进数组s[j],然后J自增。
		}
		if(a[i]=='R'){
			push(S,a[i]);//入栈
			s[j++]='I' ;
			c[n++]=Pop(S);//出栈
			s[j++]='O' ;
		}
	}

    char r=Pop(S);//出栈记录到该r 
    while(r) {//当r 为 0  就结束 
        s[j++]='O';//出栈 O 
        c[k++]=r;//将Y记录到里面 
        r=Pop(S);//再次将出栈的给r 
    }
   
    for(i=0; i<j; i++) {
        printf("%c",s[i]);//输出操作结果  
    }
    printf("\n");
   // for(i=0;i<k;i++){
     //   printf("%c",c[i]);
    //}
    return 0;
}

 

                                                  

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值