题目:Borrowers
题意:模拟一个图书管理系统,先给出书架上的书,然后有3种指令:BORROW指令表示借书,RETURN指令表示还书,SHELVE指令表示把所有已归还但还未上架的图书排序后依次插入书架并输出图书标题和插入位置(可能是第一本书或者某本书的后面)。图书排序的方法是先按作者从小到大排,再按标题从小到大排。在处理第一条指令之前,你应当先将所有图书按照这种方式排序。
思路:用结构体表示(书名,作者,是否在书架上),用map<书名,编号>建立个索引;然后处理指令即可:
BORROW:用索引找到本书位置,然后标记下架
RETURN:用索引找到本书的完整信息,存入容器中
SHELVE:用索引找到本书位置,然后向前遍历:当找到首个存在的书,即按要求输出即可,如果没找到,说明当前书为当前书架的第一本!
代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct bookInfo{
string title;//书名
string author;//作者
bool exist;//是否在书架上
};
vector<bookInfo>bookshelf;//书架
vector<bookInfo>noAvailavle;//借出去的书
map<string,int>index;//索引:给图书编号
bool cmp(bookInfo a,bookInfo b){//排序
if(a.author == b.author)
return a.title < b.title;
return a.author < b.author;}
int main()
{
char str[100];
while(cin.getline(str,100) && str[0] != 'E')
{
string temp; bookInfo book; int i;
for(i=1;str[i]!='"';i++) temp += str[i];
book.title = temp;
temp.clear();
for(int j=i+5;str[j]!='\0';j++) temp += str[j];
book.author = temp;
book.exist = true;
bookshelf.push_back(book);
}
sort(bookshelf.begin(),bookshelf.end(),cmp);
for(int i=0;i<bookshelf.size();i++) index[bookshelf[i].title] = i;//给图书添加编号,用于下边方便找书的位置
while(cin.getline(str,100) && str[0]!='E')
{
string name;
if(str[0] != 'S') for(int i=8;str[i]!='"';i++) name += str[i];
if(str[0] == 'B') bookshelf[index[name]].exist = false;//标记图书借出
if(str[0] == 'R') noAvailavle.push_back(bookshelf[index[name]]);//收集还的书
if(str[0] == 'S')
{
sort(noAvailavle.begin(),noAvailavle.end(),cmp);//按题意需排序
for(int i=0;i<noAvailavle.size();i++)
{
string temp = noAvailavle[i].title;
int j,start = index[temp];
for(j=start-1;j>=0;j--)//从当前归还的书往前找首个存在的图书
{
if(bookshelf[j].exist)
{
cout << "Put \"" << temp << "\" after \"" << bookshelf[j].title << "\"\n";
break;
}
}
if(j < 0)//没有找到,说明此书为当前书架的第一本!
cout << "Put \"" << temp << "\" first\n";
bookshelf[start].exist = true;//标记已归还上架
}
noAvailavle.clear();//清空借书容器,(没有END前还会再借书还书的!)
cout << "END\n";
}
}
return 0;}