最近帮学习者解决了UVA 230的题解,说说我的几点看法
题意:输入几本书的信息,包括书名、作者名 以“END”结束;然后再输入操作信息,有“BORROW" ,“RETURN”,"SHELVE”分别表示借、环、上架,以“END”结束。对于每一个"SHELVE”操作,按照题目要求输出归还的书应该放在哪个位置,要求按照先作者后书名的升序顺序进行输出,并输出“END”。
总的来说,这道题简单,不涉及算法,模拟题。
解题思路:
(1)处理书的信息
将每本书的书名和作者存储起来,这种情况,一般采用结构体数组;这里对字符串的输入处理强调一下:对于这种有空格的字符序列输入,建议用getline输入,避免多空格存在的情况(题意并没有明确字符串之间只有一个空格),然后用字符串的操作函数取出书名和作者名的字符串;
(2)处理书的排列顺序
由于题目要求按照先作者后书名的升序顺序进行输出,因此,我们可以事先对书的结构体按照这种方式进行排序,这不会影响结果。这里就涉及到结构体排序,需要重写cmp函数。
(3)处理书的状态
初始状态时,每本书都在书架上。根据输入的操作信息来修改书的状态,修改后的书的状态分为三种:在书架上,借走、归还但是还没有上架(特别注意)。对于这点处理的方式很多,可以在书的结构体中增加一个state状态成员,在操作中对它进行修改,一定要注意归还后的书要改变状态;也可以用一个vector数组存储正在书架上的书,如果书被借走,我就erase;如果上架,我就insert,但是这种操作一定要注意第一个元素的特殊处理。
整个思路就是这样,对于这种OJ上的题,对输出格式的要求很高,如果在这方面比较弱的道友可以先学一学输入输出专题!
为了便于道友们向我咨询问题,特意开设了一个免费的知识星球——CaptianXue,星球提供学习、理财、生活、职场等各类文章和免费答疑!!
)
现在直接上代码:
#include<iostream>
#include<queue>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
struct libr {
string title;//书名
string author;//作者
} book[1000];
map<string,string>book_state;//由于书名不会相同,所以书名和书的状态对应。
bool cmp(libr &a,libr &b) {
if(a.author.compare(b.author)==0) {
return a.title<b.title;//如果作者一样,则按照标题从小到大排序
} else {
return a.author<b.author;
}
}
int main() {
string s;
int no=0;//因为sort是从0开始的,所以要对应
int i,j;
while(getline(cin,s)&&(s!="END")) { //读取每一行
int pos = s.rfind('"'); //从字符串的尾部往前找到第一个"
book[no].title = s.substr(0, pos + 1);
book[no].author = s.substr(pos + 5);
no++;
}
sort(book,book+no,cmp);//结构体进行排序
for(i=0; i<no; i++) {
book_state[book[i].title]="SHELVE";//初始化所有的书的状态,表示都在架子上。
}
string str;
string st1,st2;
while((cin>>str)&&(str!="END")) {
if(str=="BORROW") {
getchar();//去除空格
getline(cin,st1);
book_state[st1]="BORROW";
} else if(str=="RETURN") {
getchar();
getline(cin,st2);
book_state[st2]="RETURN";
} else if(str=="SHELVE") {
for(i=0; i<no; i++) {
if(book_state[book[i].title]=="RETURN") { //注意归还后要改变其状态。
book_state[book[i].title]="SHELVE";//注意这里是=不是==
int index=-1;//定位
if(i==0) {
index=-1;
} else {
for(j=i-1; j>=0; j--) {
if(book_state[book[j].title]=="SHELVE") {
index=j;//找到合适的位置。
break;
}
}
}
if(index==-1)
cout<<"Put "<<book[i].title<<" first"<<endl;
else
cout<<"Put "<<book[i].title<<" after "<<book[index].title<<endl;
}
}
cout<<"END"<<endl;
}
}
return 0;
}