栈的部分应用(练习)
有一列火车车厢进栈,可以通过站台改变车站顺序,已知入站序和出站顺序,问站台最少能容纳多少节车厢(要求第一行输入车厢长度,第二行输入入站序列,第三行输入出站序列)
如:进站顺序为ABCDE,出站顺序为CBEDA,则站台容纳量为3,保证出站顺序合法
思路,用两个数组分别存放入站顺序和出站顺序,两指针遍历两数组,从示例中发现进站早的A比进站晚的C后出,发现属于FILO,符合栈的数据结构,故考虑用栈解决.
则当入站A时,发现A不出站,A存入栈中,入站B,B暂不出站,压入栈中,入站C时,C入站又出站,保证站台容纳量足够小,为减少分类讨论情况,故考虑C压入栈后立刻出栈.
整理入栈条件,栈空入栈,或栈顶元素与出站数组不同时入栈,出栈条件则为,不入栈就出栈.
架简易栈处理
点击查看代码
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 100;
int main(){
//生成数组储存输入值
int a[Maxsize];
int b[Maxsize];
int n,i=0,j=0;//i,j不是指针,但这里作为下标指针使用
int flag;//用来记录最少站台的值
printf("请在第一行输入车厢数,第二行输入入站元素序列,第三行输入出站元素序列\n");
scanf("%d\n",&n);
gets(a);
gets(b);
//建立简易栈
char s1[Maxsize];
int top=-1;
int length=0;
flag=length;
while(i<n){
if(top==-1||s1[top]!=b[j]){
//入栈
s1[++top]=a[i++];
length++;
flag=flag>length?flag:length;//用flag记录最少需要站台数
}
else{
//出栈
top--;
length--;
j++;
}
}
printf("%d\n",flag);
return 0;
}
点击查看代码
#include<stdio.h>
#include<stdlib.h>
//火车站进站出站,知道进站顺序与出站顺序,求站台最小容纳车厢数
#define MaxSize 100
typedef struct stack{
char *s;
int length;
int top;
}Sqstack;
//初始化栈
void InitStack(Sqstack *S1){
S1->s=(char *)malloc(MaxSize*sizeof(char));
S1->length=0;
S1->top=-1;
}
//入栈
void PushStack(Sqstack *S1,char ch){
S1->s[++S1->top]=ch;
S1->length++;
}
//出栈
char PopStack(Sqstack *S1){
S1->length--;
return S1->s[S1->top--];
}
int main(){
int n,i=0,j=0;
scanf("%d\n",&n);
char a[MaxSize];
gets(a);
char b[MaxSize];
gets(b);
Sqstack S1;
//初始化栈
InitStack(&S1);
int flag=S1.length;
while(i<n){
if(S1.top==-1||S1.s[S1.top]!=b[j]){
//入栈
PushStack(&S1,a[i++]);
flag=flag>S1.length?flag:S1.length;
}
else{
//出栈
PopStack(&S1);
j++;
}
}
printf("%d\n",flag);
return 0;
}