栈的部分应用(练习)

有一列火车车厢进栈,可以通过站台改变车站顺序,已知入站序和出站顺序,问站台最少能容纳多少节车厢(要求第一行输入车厢长度,第二行输入入站序列,第三行输入出站序列)

如:进站顺序为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;
}

posted on 2024-08-18 20:58  为什么要悲观啊  阅读(13)  评论(0编辑  收藏  举报