就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置。要求有两点:
需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序;否则书本按作者名大小排序
需要归还的书的位置前面没有书籍时,需要特殊处理
"The Canterbury Tales" by Chaucer, G.
"Algorithms" by Sedgewick, R.
"The C Programming Language" by Kernighan, B. and Ritchie, D.
END //结束信息录入
BORROW "Algorithms"
BORROW "The C Programming Language" //借书
RETURN "Algorithms" //还书
RETURN "The C Programming Language"
SHELVE //打印提示信息
END //结束
Put "The C Programming Language" after "The Canterbury Tales"
Put "Algorithms" after "The C Programming Language"
END
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map> //重点:map,set支持双向迭代
#include <vector>
#include <string>
#include <iterator>
using namespace std;
map<string, map<string,int> >Books; //是支持双向迭代的,用于存放<作者,<书名,借阅状态>>
map<string, string>Title_Author; //用于映射<书名,作者>
vector<string> Books_Title; //存放所有要归还的书名
int main()
{
freopen("data5_8_h.in", "r", stdin);
freopen("data5_8_h.out", "w", stdout);
string book_t, book_a,all_info;
//获取图书信息
while (getline(cin, all_info)&&all_info!="END")
{
int start, end;
start = all_info.find('"');
end = all_info.find('"', start + 1);
book_t = all_info.substr(start + 1, end - start -1);
start = all_info.find("by ");
book_a = all_info.substr(start + 3);
if (!Books.count(book_a))
Books[book_a] = map<string, int>();
(Books[book_a])[book_t] = 1;
Title_Author[book_t] = book_a;
}
//进行图书借阅
while (cin >> all_info&&all_info != "END")
{
if (all_info[0] == 'B') //借书
{
getline(cin, book_t);
book_t = book_t.substr(book_t.find('"') + 1, book_t.rfind('"') - book_t.find('"')-1);
book_a = Title_Author[book_t];
Books[book_a][book_t] = -1;
}
else if (all_info[0] == 'R') //还书
{
getline(cin, book_t);
book_t = book_t.substr(book_t.find('"') + 1, book_t.rfind('"') - book_t.find('"')-1);
Books_Title.push_back(book_t);
}
else if (all_info[0] == 'S') //入库
{
for (int i = Books_Title.size() - 1; i >= 0; i--)
{
book_t = Books_Title[i];
Books_Title.pop_back();
book_a = Title_Author[book_t];
//在当前自己作者下找
map<string, map<string, int> >::iterator a_rit = Books.find(book_a);
for (; a_rit != Books.end(); a_rit--) //如何对双向迭代器进行结束判断??疑惑---有时间调试一下
{
//进行书籍操作
bool flag = false;
map<string, int>::iterator t_rit = a_rit->second.find(book_t);
for (; t_rit-- != (a_rit->second).begin();) //疑惑:若是使用上面迭代的形式;t_rit != (a_rit->second).end();t_rit--则输出数据不一致
{
if (t_rit->second == 1)
{
cout << "PUT "" << book_t << "" after "" << t_rit->first << """ << endl;
(*(Books[book_a]).find(book_t)).second = 1;
flag = true;
break;
}
}
if (flag)
break;
}
if (a_rit == Books.end())
{
(*(Books[book_a]).find(book_t)).second = 1;
cout << "PUT "" << book_t << "" first" << endl;
}
}
cout << "END" << endl;
}
}
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return 0;
}