利用hashtable思想,保存在一个字符串中找到第一个只出现一次的字符

编程思想:利用hashtable的思想,将输入的字符,映射到一个哈希表中,hash函数为:对输入字符的ASCII码求模运算,映射到在hashtable中的具体下标。通过对hashtable的初始化,均为‘\0’,如果输入的字符,映射到hashtable的相应位置,其内容不是‘\0’,则表示已经有字符放置,则该字符一定不是只出现一次。

 

#include <iostream>
using namespace std;
#define HASHSIZE 12

typedef struct HashTable
{
     char *elem;
      int  count;
}*pHash; // 要实现此要求,不需要定义这么复杂的hash,此处只是为了更好理解hash而使用


void initHashTable(pHash &ph)  //初始化
{
    int i = 0;
 int m=HASHSIZE;
 ph->elem = (char *)malloc(m*sizeof(char));
 for(i=0; i<m; i++)
 {
     ph->elem[i] = '\0';
 }
 return ;
}

int hash(int key) // 哈希函数
{
    return key%HASHSIZE;
}

int insertHashTable(pHash &ph,int value)  // 判断是否是已经存在
{
    int flag = 0;
 int addr = hash(value);
 if (ph->elem[addr]!= '\0')
 {
     flag++;
 }

 ph->elem[addr] = value;
 return flag;
}

int main()
{
    int i=0;
 int flag = 0;
 char arr[HASHSIZE];

 pHash phash=NULL;
 cout<<"请输入一串字符"<<endl;
    cin>>arr;

 phash = (pHash)malloc(HASHSIZE*sizeof(char));
    initHashTable(phash);

 for(i=0; i<HASHSIZE; i++)
 {

  flag = insertHashTable(phash,arr[i]);

 }

    if(flag == 0)
 {
     cout<<"第一个只出现一次的字符:"<<arr[i]<<endl;   // 此处还没有想好如何保存arr[i]

    return 0;
 }
 
 cout<<"遍历结束,字符均不唯一出现"<<endl;
 return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值