java实现唯一可译码的判别_[求助]唯一可译码判决准则问题(java转化为c)

[求助]唯一可译码判决准则问题(java转化为c)

求助]唯一可译码判决准则问题

//这个程序有什么问题?那位大哥能把他变成c语言版的

唯一可译码判决准则:

已知:信源符号个数,码字集合C。

算法:

1. 考查 中所有的码字,若 是 的前缀,则将相应的后缀作为一个尾后缀码放入集合 中;

2. 考查 和 两个集合,若 是   的前缀或 是 的前缀,则将相应的后缀作为尾随后缀码放入集合 中;

3. = 即为码 的尾随后缀集合。

4. 若 中出现了 中的元素,则算法终止,返回假( 不是唯一可译码);否则若 中没有出现新的元素,则返回真。

我真不知道怎么做,想方设法做了一种结果。没有完全按照它的算法做。大体上满足了要求,但是不够精减,没有对可能出现的输入作出相应的处理,请大家帮忙。

import java.util.*;

import javax.swing.JOptionPane;

public class Testlist

{

static boolean flag=true;

//看两个集合是否还要继续比较,加入后缀的标志。

static boolean result=true;

//唯一可译码的标志。

static String cstring=new String();

//用来引用输入的字符。

static ArrayList ccString=new ArrayList();

//用来存储输入的码符号。

static int c; //用来记录输入的信源的个数。

static String endString;//用来引用要加入mylist中的后缀。

// 信源个数的输入,码符号的输入函数。

public static void inputString()

{

ccString.clear();

cstring =JOptionPane.showInputDialog("请输入信源的个数");

c = Integer.parseInt(cstring);

for( int i=0;i

{

cstring=JOptionPane.showInputDialog("请输入码符号");

ccString.add(cstring);

}

JOptionPane.showMessageDialog(null,ccString,"所有的码字是",

JOptionPane.INFORMATION_MESSAGE);

String check=JOptionPane.showInputDialog("所有的码字正确吗?" +

"输入yes or no");

if(check.equals("no"))

{

Testlist.inputString();

}

}

//比较两个字符串,若相等,即不可能是唯一可译码,使result为假。

//若满足前缀关系,则返回后缀。

public static String comparestring(String str1,String str2)

{

String theResult=null;

if(str1.equals(str2))

{

result=false;

}

if(result)

{

if(str1.startsWith(str2))

{

theResult=str1.substring(str2.length(),str1.length());

}

if(str2.startsWith(str1))

{

theResult=str2.substring(str1.length(),str2.length());

}

}

return theResult;

}

//比较两个集合。若有相同的元素,则不是唯一可译码。使result为假。

//若其中有元素满足前缀关系。则提取后缀添加到mylist中。

public static void com(ArrayList a,ArrayList b)

{

flag=false;

String aa;

String bb;

cp2: for(int i=0;i

{

for(int j=0;j

{

aa=(String)a.get(i);

bb=(String)b.get(j);

endString=comparestring(aa,bb);

if(!result)

{

break cp2;

}

if(endString!=null)

{

if(!b.contains(endString))

{

b.add(endString);

flag=true;

break cp2;

}

}

}

}

if(flag)

{

com(a,b);

}

}

public static void main(String args [])

{

String st1,st2;

//boolean addString=false;

Testlist test=new Testlist();

ArrayList mylist=new ArrayList();

test.inputString();//

cp: for( int m=0;m

{

for(int j=m+1;j

{

st1=(String)ccString.get(m);

st2=(String)ccString.get(j);

endString= comparestring(st1,st2);

if(!result)

{

break cp;

}

if(endString!=null)

{

/* addString=true;

* for( int k=0;k

* {

* if(endString.equals(mylist.get(k)))

* {

* addString=false;

* }

* }

* if(addString)

* {

* mylist.add(endString);

* }

*/

if(!mylist.contains(endString))

{

mylist.add(endString);

}

}

}

}

test.com(test.ccString,mylist);

if(result)

{

JOptionPane.showMessageDialog(null,"是唯一可译码。",

"判断是否是唯一可译码",JOptionPane.INFORMATION_MESSAGE);

}

else

{

JOptionPane.showMessageDialog(null,"不是唯一可译码。",

"判断是否是唯一可译码",JOptionPane.INFORMATION_MESSAGE);

}

// System.out.println(mylist);

System.exit(0);

}

}

//测试码可以为:6 {01,111,011,00,010,110}或 7 {a,ac,ad,abb,bad,deb,bbcde}

//the result is yes and not.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值