现在的位置: 首页 > 综合 > 正文

字符频率统计(二叉树和普通方法)

2013年09月22日 ⁄ 综合 ⁄ 共 2385字 ⁄ 字号 评论关闭

(一)二叉树方法:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define maxword 100

typedef struct tnode
{
 char ch;
 int count;
 struct tnode *lchild,*rchild;
}BTree;

 

void CreaTree(BTree* &p,char c)
{
 if(p==NULL)
 {
  p = (BTree*)malloc(sizeof(BTree));
  p->ch = c;
  p->count=1;
  p->lchild = p->rchild =NULL;
 }
 else if(c==p->ch)
  p->count++;
 else if(c<p->ch)
  CreaTree(p->lchild,c);
 else
  CreaTree(p->rchild,c);
}

 

void InOrder(BTree* &p)
{
 if(p!=NULL)
 {
  InOrder(p->lchild);
  printf(" %c(%d)/n",p->ch,p->count);
  InOrder(p->rchild);
 }
}

void main()
{
 BTree* root=NULL;
 int i = 0;
 char str[maxword];
 printf("/n");
 printf("输入字符串:");
 gets(str);
 while(str[i]!=NULL)
 {
  CreaTree(root,str[i]);
  i++;
 }
 printf("字符出现的次数:/n");
 InOrder(root);
    printf("/n");
}

(二) 普通方法

1.

====================

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;

typedef struct
{
 char ch;  //字符
 int num;  //字符个数
}CType;

int Record(string s,CType cnum[])
{
 int i,j,k=0;        //k记录cnum中元素的个数,即是字符的种类
 for(i=0;i<s.length();i++) //对原始串元素逐个进行检查
 {
  if(k==0)      //cnum中没有元素的时候,将s[i]直接放到cnum中
  {
   cnum[k].ch = s[i];
   cnum[k].num = 1;
   k++;
  }
  else
  {   //cnum中存在元素时,查找是否有相同的字符
   for(j=0;j<k && s[i]!=cnum[j].ch;j++)
    ;     //空操作只是为了逐次检查cnum中已有的每个元素
   if(j>=k)  //s[i]不在cnum中,添加进来
   {
    cnum[k].ch = s[i];
    cnum[k].num = 1;
    k++;
   }
   else    //s[i]在cnum中,增加cnum中该元素的计数
    cnum[j].num++;
  }
 }
 return k;
}

int main()
{
 CType cnum[128];
 string str;
 cout<<"请输入字符串,并按两次回车键"<<endl;
 getline(cin,str);  //读入字符串到string中
 cout<<str<<endl;
 int k=Record(str,cnum);
 for(int i=0;i<k;i++)
  cout<<cnum[i].ch<<":"<<cnum[i].num<<endl;
 return 0;
}

=====================

 

 2. (本质上合法一是一样的,只是没有采用结构体的形式,而是开了两个数组)

 

=====================

#include <iostream>
#include <string>
using namespace std;
#define N 1000

int frequency(string & s, char A[],int C[],int k)
{
    //A[]存放字符的种类,C[]存放每种字符的个数,k为字符的种类数
 int i,j, len=s.length();
 if(!len)
 {
  cout<<"空串!"<<endl;
  return k=0;
 }
 else
 {
  A[0]=s[0];C[0]=1; k=0; 
  for(i=1;i<len;i++) C[i]=0;
  for(i=1;i<len;i++)
  {                   //检测串中所有字符
   j=0;
   while(j<k && A[j]!=s[i]) j++; //检查s[i]是否已在A[ ]中
   if(j==k)
   {
    A[k]=s[i]; C[k]++; k++;  //[i]从未检测过,则将其输入到下个数组元素中
   }
   else
    C[j]++;    //s[i]已经检测过
  }
  return k;
 }
}

void main()
{
 string str;
 char A[N];
 int C[N];
 int k=0,j;
 cout<<"input a string :"<<endl;
 getline(cin,str);
 int m=frequency(str,A,C,k);
 cout<<"出现的字符是: 次数"<<endl;
 for(j=0;j<m;j++)
  cout<<A[j]<<":"<<C[j]<<endl;
 cout<<endl;
 cout<<"字符个数是:"<<str.length()<<endl;
}

 

 

===================================

抱歉!评论已关闭.