栈的应用:火车调度问题概述
多参考,勿抄袭。
输入:第一行是一个整数 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;
}