题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。
例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从字符流中读出字符"google"时,第一个只出现一次的字符是"l"。
解析:字符只能一个接着一个从字符流中读出来。可以定义一个数据容器来保存字符在字符流中的位置。
如哈希表,用字符的ASCii码作为哈希表的键值,而将字符出现的位置作为哈希表的值。
#include <iostream>
#include <vector>
#include <limits>
#include <stdio.h>
using namespace std;
class CharStatistics
{
public:
CharStatistics():index(0)//构造函数参数index初始化为0
{
//将哈希表初始化为-1,表示没有字符存储
for(int i=0;i<256;++i)
hashtable[i]=-1;
}
//遍历字符流,设置哈希表
void insertfun(char ch)
{
//该字符是第一次被检索到,元素值设为字符位置
if(hashtable[ch]==-1)
hashtable[ch]==index;
//该字符已经被检索到一次,元素值标记为-2
else if(hashtable[ch]>=0)
hashtable[ch]=-2;
++index;
}
//查找第一个不重复字符
char FirstAppearingOnce()
{
char ch='\0';
int minindex=numeric_limits<int>::max();//返回编译器可取的有限最大值
for(int j=0;j<256;++j)
{
if(hashtable[j]>=0&&hashtable[j]<minindex)
{
ch=(char)j;//将下表转换为字符
minindex=hashtable[j];
}
}
return ch;
}
private:
int hashtable[256];
int index;
};
//测试程序
void Test(char *testname, CharStatistics chars,char expected)
{
if(testname!=NULL)
printf("%s begins:",testname);
if(chars.FirstAppearingOnce()==expected)
printf("Passed.\n");
else
printf("Failed.\n");
}