栈的模拟 之 健身馆 (c语言/c++编程)

来源:互联网 发布:it分销商 编辑:程序博客网 时间:2024/05/15 08:02
题目描述

民院附近新开了一家健身馆,新店开业,优惠促销,所以Jarily和他的同学毫不犹豫的交钱入会。
去了健身馆才发现,里面跑步机的数量有限,而需求跑步机的人很多,所以当跑步机没有空闲的时候,只能排队等候,有的人等了一会儿没有耐心就会放弃,比如Jarily。
现在给出跑步机的数量,进入和离开跑步机区域的人的序列,需要你编程求出健身馆这一天有多少人使用上了跑步机。
假设每个人进入该区域时,跑步机有空闲则直接开始使用直到他离开,如果没有空闲的跑步机则在门外排队等待,直到出现空闲的跑步机则开始使用或者等待一段时间后失去耐心而离开。

输入

第一行输入为一个正整数N,表示该健身馆跑步机的数量,N不会超过20。
接下来输入一行由大写字母构成的字符串,表示一天中进入或者离开跑步机区域的人的序列。
一个大写字母代表一个人,该序列中出现的大写字母必然会出现两次,分别代表该人进入和离开的顺序,该字母第一次出现表示进入,第二次出现表示离开。

输出

输出共有1行,输出这一天中使用上跑步机的人数。

样例输入

3GACCBDEBEAGD

样例输出

5

提示

一共有三台跑步机,G,A,C分别进入都可以直接使用,然后C离开,B进入,则B可以使用C所使用的那台跑步机。当D进入的时候,跑步机分别被G,A,B使用,所以他只能等待。然后是E进入,同理,他只能排在D的后面等待。
接下来是B离开,此时D可以使用B所占用的跑步机,E依然等待,然后失去耐心直接离开了,后面是A,G,D分别离开,所以这一天使用上跑步机的人是G,A,C,B,D,一共五个人。


分析:栈的模拟


AC代码如下:

//3 GAACCBDEBEGD 输出 6//3 AABCDEFFDBCE 输出 5//3 GACCBDEBEAGD 输出 5
#include "iostream"#include "string"using namespace std;int main(){int n,i;int num=0;int b[100];//记录当前字符出现次数int res=0;//最终结果bool a[100];//标记当前字符,以便判断该字母是进栈还是出栈char c[100];//存储所有出现的字符string str;for (i='A';i<='Z';i++) a[i]=false;//初始化为false,表示字符未进栈for (i=0;i<100;i++)   b[i]=0;cin>>n>>str;for (i=0;i<str.length();i++){int ss=0;b[str[i]]++;//记录当前字符出现次数if (a[str[i]]==false&&b[str[i]]==1){ //进栈条件c[num++]=str[i];}if (b[str[i]]>=2&&a[str[i]]==false){//该字符第二次出现,即该人离开for (int j=0;j<num;j++){//在栈中,查找该人所在位置ssif (a[c[j]]==false) ss++;if (c[j]==str[i])break;}if (ss<=n)res++;//判断该人是锻炼后离开,还是等待之后离开}if (b[str[i]]>=2){//该人已经离开(即出栈),标记为truea[str[i]]=true;}}cout<<res<<endl;return 0;}


0 0
原创粉丝点击