图书管理系统(Borrowers,UVa230)

题目链接: 图书管理系统(UVa230)

C++代码:

#include <string>
#include <set>
#include <iostream>
#include <cassert>
#include <vector>
#include <map>
using namespace std;

struct Book{
    string title,author;
    Book(const string& t,const string&a):title(t),author(a){}
    bool operator<(const Book rhs) const{
        return author<rhs.author||(author==rhs.author&&title<rhs.title);
    }
};
vector<Book> books;
map<string,int> bookIndice;
struct indexComp{
    bool operator()(const int& lhs,const int& rhs)const{
        return books[lhs]<books[rhs];
    }
};

set<int,indexComp> shelf,lib;

void borrow(const string& t){
    assert(bookIndice.count(t));
    int idx=bookIndice[t];
    if(lib.count(idx)){
        lib.erase(idx);
    }else{
        assert(shelf.count(idx));
        shelf.erase(idx);
    }
}

void retBook(const string& t){
    assert(bookIndice.count(t));
    int idx=bookIndice[t];
    assert(!lib.count(idx));
    assert(!shelf.count(idx));
    shelf.insert(idx);
}

void shelve(){
    for(set<int>::iterator it=shelf.begin();it!=shelf.end();it++){
        int idx=*it;
        set<int>::iterator  pit=lib.insert(idx).first;
        if(pit==lib.begin())
            cout<<"Put "<<books[idx].title<<" first"<<endl;
        else{
            pit--;
            cout<<"Put "<<books[idx].title<<" after "<<books[*pit].title<<endl;
        }
    }
    shelf.clear();
    cout<<"END"<<endl;
}

int main(){
    string buf;
    while(true){
        getline(cin,buf);
        if(buf=="END") break;
        int spos=buf.find(" by ");
        assert(spos!=string::npos);
        string title=buf.substr(0,spos),author=buf.substr(spos+4);
        int idx=books.size();
        bookIndice[title]=idx;
        books.push_back(Book(title,author));
    }
    for(int i=0;i<books.size();i++)
        lib.insert(i);
    string cmd,title;
    while(true){
        getline(cin,buf);
        if(buf=="END") break;
        cmd=buf.substr(0,6);
        if(cmd[0]=='S') shelve();
        else{
            title=buf.substr(cmd.size()+1,buf.size());
            if(cmd[0]=='B') borrow(title);
            else{
                assert(cmd[0]=='R');
                retBook(title);
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值