关于#c++#的问题:这个顺序栈实现进制转换(10进制数转换为任意进制)错在哪为什么实现不成功

这个顺序栈实现进制转换(10进制数转换为任意进制)错在哪为什么实现不成功,

img

img

你是字符串ASCII,不是整数,要先-'0'然后再计算
输出的时候+'0'再输出。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7638746
  • 这篇博客你也可以参考下:c++第五章(一维数组,二维数组的定义,引用和初始化的注意事项和用法详解,数组的遍历以及数组作为函数参数的例子等等)
  • 除此之外, 这篇博客: 【C++】【哈希表】【哈希函数】实现自己的哈希表,解决哈希冲突;动态哈希表;中的 1.1、实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 重点:

    1. 申请的是map的数组;即底层用的是平衡树,而不是链表。要求key可比较。
    2. 通过位与将hash计算出来的数修改成正数,能作为索引使用
    3. 构造函数可以互相调用
    4. 得到map用指针操作,以减少多次hash计算的消耗。同样用引用也可以。
    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++ 设计模式原理与实战大全-架构师需备课程课程中的 简单工厂实用工程技术:C++对象动态创建技术与配置化开发小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    在参考代码中没有出现错误信息或错误提示,代码本身是用C语言实现的魔术师发牌问题,使用了循环链表来模拟牌堆,通过遍历链表和设定牌堆顺序来完成发牌的过程,并最终销毁链表,整个过程运行没有出现错误。

    如果想对代码进行改进,可以对以下几点进行考虑:

    1. 代码的可读性和易用性,可以使用更加规范的缩进和注释,提供更加友好的用户界面,尤其是在涉及到指针及其操作时,更多地提供解释和防范操作错误的提示。

    2. 在设计数据结构和算法时,可以尽量简洁和高效地完成任务,避免过度冗余和低效的操作。

    3. 在代码的运行和测试中,要注意边界条件和异常情况的处理,以更加完善和鲁棒的方式保证程序的正确性。

    对于具体实现的细节及代码优化,需根据具体情况进行分析和实践。