随机生成逆波兰式···················

Kevin_qing 2001-06-01 01:38:00
讨论一下:
有什么比较简单的算法可以生成这个东西?
...全文
180 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_qing 2001-06-04
  • 打赏
  • 举报
回复
靠~~~~~~~~
为什么没有给分的选项了?
Kevin_qing 2001-06-01
  • 打赏
  • 举报
回复
结帐
Kevin_qing 2001-06-01
  • 打赏
  • 举报
回复
分两遍计算好了,
先生成opt 和data的排列,再生成具体的操作符和操作数,最后生成机器代码
liuto 2001-06-01
  • 打赏
  • 举报
回复
呵呵,好,有意思
liuto 2001-06-01
  • 打赏
  • 举报
回复
你可以设最初两个必须是操作数。还要写两个函数,一个随即产生数,一个随即产生符
Kevin_qing 2001-06-01
  • 打赏
  • 举报
回复
nValideData=0;
while(1)
{
if(in is data )
{
nValideData++;
}
else
{
nValideData-=opt_req[in];//(该操作需要的操作数个数)
nValideData+=1;
}
assert(nValideData>0);
}

来试试扫描
ab+c+d!+

1:
in=a
nData=1;
2:
in=b
nData=2
3:
in=+
nData=1;
4:
in=d
nData=2
5:
in=!
nData=2
6
in=+
nData=1
得道一个数,正好是结果
liuto 2001-06-01
  • 打赏
  • 举报
回复
呵呵,废话,最后当然是操作符。sorry
liuto 2001-06-01
  • 打赏
  • 举报
回复
你还要保证最后是操作符
Kevin_qing 2001-06-01
  • 打赏
  • 举报
回复
新办法~~~~

考察错误的表达式:
a+
原因在data 只有1个 ,不够+ opt 2 的需求

所以可以这么做

从左往右扫描表达式。
nValideData=0;
while(1)
{
if(in is data )
{
nValideData++;
}
else
{
nValideData-=opt_req[in];//(该操作需要的操作数个数)
}
assert(nValideData>0);
}

然后生成的代码就好写了
Kevin_qing 2001-06-01
  • 打赏
  • 举报
回复
但是
ab+!怎么办!!!!!
liuto 2001-06-01
  • 打赏
  • 举报
回复
噢,我看错了,你得方法好象可以。
liuto 2001-06-01
  • 打赏
  • 举报
回复
abc++是对的呀。不能象你那样记数,似乎就得反演。
Kevin_qing 2001-06-01
  • 打赏
  • 举报
回复
我又想了一个:
考察:ab+c+
abc++
其中opt比data少1,并且在每个opt左边的data都>=opt+1
似乎这样就好生成了
一次应该就可以生成完整的

伪代码:
BYTE stack[1024];
int data_count=0;
int opt_count=0;
for(int i=0;i<stack_len;i++)
{
do{
stack[i]=rand();
if(stack[i] is data)
{
data_count++;
break;
}
else
{
if(data_count>opt_count+1)
{
opt_count++;
break;
}
}
}while(1);
}

差不多就可以了吧
liuto 2001-06-01
  • 打赏
  • 举报
回复
比如发现操作数不够就添操作数,操作符不够就添操作符
liuto 2001-06-01
  • 打赏
  • 举报
回复
讨论一下,先乱七八糟填一堆东西到栈里,然后反演,发现错误就改正,这样是不是可行?

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧