声明一个银行账户类Account,该类有账号(id),余额(balance)两个数据成员,有获取账号,获取余额,存款和取款的函数,以及必要的构造函数。请按上述要求声明该银行账户类并在main函数中定义该类的多个对象,然后对它们进行存取款和查询余额的操作。
class Account {
string id;
int balance;
public:
Account(string ID) {
id = ID;
}
int deposit(int amount) { balance += amount; return amount; }
int withdraw(int amount) { balance -= amount; return amount; }
string ID() { return id; }
int balance() { return balance; }
};
可以写一颗以id为键值的查找树
#include<iostream>
using namespace std;
template<typename KeyType, typename ValType>
class Size_Balanced_Tree {
struct node {
int Size;//important!!!
//cnt the number of child nodes
KeyType key;
ValType val;
node *lchild, *rchild;
node(KeyType k, ValType v) {
lchild = 0, rchild = 0; Size = 0;
val = v; key = k;
}
};
node *root;
inline int SizeOf(node *&target) {
return target ? target->Size : 0;
}
void Lrotate(node *&target) {
node *temp = target->lchild;
target->lchild = temp->rchild;
temp->rchild = target;
temp->Size = target->Size;
target->Size = SizeOf(target->lchild) + SizeOf(target->rchild) + 1;
target = temp;
}
void Rrotate(node *&target) {
node *temp = target->rchild;
target->rchild = temp->lchild;
temp->lchild = target;
temp->Size = target->Size;
target->Size = SizeOf(target->lchild) + SizeOf(target->rchild) + 1;
target = temp;
}
void Maintain(node *& target) {
if (target->lchild != NULL) {
if (SizeOf(target->rchild) < SizeOf(target->lchild->lchild))
Lrotate(target);
else if (SizeOf(target->rchild) < SizeOf(target->lchild->rchild)) {
Rrotate(target->lchild);
Lrotate(target);
}Maintain(target->lchild);
}
if (target->rchild != NULL) {
if (SizeOf(target->lchild) < SizeOf(target->rchild->rchild))
Rrotate(target);
else if (SizeOf(target->lchild) < SizeOf(target->rchild->lchild)) {
Lrotate(target->rchild);
Rrotate(target);
}Maintain(target->rchild);
}
return;
}
void insert(node *&target, KeyType &key, ValType &val) {
if (!target) {
target = new node(key, val);
return;
}
target->Size++;
if (key > target->key)insert(target->rchild, key, val);
else if (key != target->key)insert(target->lchild, key, val);
else return;
Maintain(target);
}
ValType& query(node *&target, KeyType key) {
if (target == NULL) {
int r = 0;
return r;
}
if (target->key == key)return target->val;
else if (target->key < key)return query(target->rchild, key);
else return query(target->lchild, key);
}
public:
Size_Balanced_Tree() {
root = 0;
}
void Create_Account(string id) {
int init = 0;
insert(root, id, init);
}
ValType deposit(KeyType id, int amount) {
return query(root, id)+=amount;
}
ValType withdraw(KeyType id, int amount) {
return query(root, id) -= amount;
}
ValType amount(KeyType id) {
return query(root, id);
}
};
Size_Balanced_Tree<string, int>acmngr;
int main() {
acmngr.Create_Account("尼玛");
acmngr.Create_Account("泥煤");
acmngr.deposit("尼玛", 3);
acmngr.withdraw("尼玛", 2);
cout << acmngr.amount("尼玛") << endl << acmngr.amount("泥煤");
}