这个顺序栈实现进制转换(10进制数转换为任意进制)错在哪为什么实现不成功,
你是字符串ASCII,不是整数,要先-'0'然后再计算
输出的时候+'0'再输出。
重点:
template<typename Key, typename Value>
class HashTable {
private:
int M;
int size;
map<Key, Value> *hashTable; //map 的数组
int hash(Key key) {
return (hashCode(key) & 0x7fffffff) % M; //负数转正数
}
int hashCode(Key key) { //用C++ 的hash函数
std::hash<Key> key_hash;
return key_hash(key);
}
public:
HashTable(int M) {
this->M = M;
size = 0;
hashTable = new map<Key, Value>[M];
}
HashTable() {
this->M = 97;
new(this)HashTable(M); //调用构造函数
}
int getSize() {
return size;
}
void add(Key key, Value value) {
map<Key, Value> *my_map = &hashTable[hash(key)]; //指针,使得只hash运算一次。
if (my_map->count(key)) {
my_map->find(key)->second= value;
}
else {
my_map->insert(make_pair(key, value));
size++;
}
}
Value *remove(Key key) {
Value temp;
map<Key, Value> *my_map = &hashTable[hash(key)];
if (my_map->count(key))
{
temp = my_map->find(key)->second;
my_map->erase(key);
size--;
}
return &temp; //注意这里有问题
//最好改成new出来,使用完了delete掉。尽量不用值传递,和传局部变量指针。
//或者在调用他的地方创建一个value,然后改造函数成传入value指针,直接把数据复制到那里去即可。就不用返回值了
}
bool contains(Key key) {
return hashTable[hash(key)].count(key);
}
Value *get(Key key) {
return &(hashTable[hash(key)])[key]; //传地址。以防value 是大型数据结构
}
void set(Key key, Value value) {
map<Key, Value> &my_map = hashTable[hash(key)]; //引用, 使得只hash运算一次。
if (!my_map.count(key)) {
throw to_string(key) + " doesn't exist";
}
//assert(my_map.count(key)!=0);
my_map.find(key)->second = value;
}
};
在参考代码中没有出现错误信息或错误提示,代码本身是用C语言实现的魔术师发牌问题,使用了循环链表来模拟牌堆,通过遍历链表和设定牌堆顺序来完成发牌的过程,并最终销毁链表,整个过程运行没有出现错误。
如果想对代码进行改进,可以对以下几点进行考虑:
代码的可读性和易用性,可以使用更加规范的缩进和注释,提供更加友好的用户界面,尤其是在涉及到指针及其操作时,更多地提供解释和防范操作错误的提示。
在设计数据结构和算法时,可以尽量简洁和高效地完成任务,避免过度冗余和低效的操作。
在代码的运行和测试中,要注意边界条件和异常情况的处理,以更加完善和鲁棒的方式保证程序的正确性。
对于具体实现的细节及代码优化,需根据具体情况进行分析和实践。