算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)
一:题目
就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置。要求有两点:
需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序;否则书本按作者名大小排序
需要归还的书的位置前面没有书籍时,需要特殊处理
(一)样例输入
"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
(三)更多测试样例:推荐https://www.jianshu.com/p/902295e378a5
二:代码实现
#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; }