数据结构后缀表达式,中缀算术表达式,求后缀算术表达式,急急 急急急急急急急急,跪求高手指点,万分感激

设有算术表达式x+a*(y-b)-c/d,该表达式的前缀表示为(),后缀表示为().这种题怎么看,有什么技巧么?_作业帮
拍照搜题,秒出答案
设有算术表达式x+a*(y-b)-c/d,该表达式的前缀表示为(),后缀表示为().这种题怎么看,有什么技巧么?
设有算术表达式x+a*(y-b)-c/d,该表达式的前缀表示为(),后缀表示为().这种题怎么看,有什么技巧么?
/question/.html可以把表达式看做是二叉树,然后前序遍历或者后续遍历?先将操作数作为叶子节点,操作符作为根节点建立二叉树.无论什么序,左子树优先于右子树,前序后序中序,指的是左子树和父节点的关系.自顶向下,左子树A操作(Operation)右子树B&,前序写&((A)(B)O),中序写((A)O(B)).后序写((A)(B)O)然后将左子树A扩展成为(C)(D)O&,(C)O&(D),或者(C)(D)O对右子树B以此类推对C&D子树以此类推,直到碰到叶子节点.如果是叶子节点,可以不用括号包裹.收藏,1.2k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
如何用js实现中缀表达式转后缀表达式然后求值
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
算法叫逆波兰表达式
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
  正常的表达式 逆波兰表达式
  a+b ---& a,b,+
  a+(b-c) ---& a,b,c,-,+
  a+(b-c)d ---& a,d,b,c,-,,+
  a=1+3 ---& a=1,3 +
  http=(smtp+http+telnet)/1024 写成什么呢?
  http=smtp,http,telnet,+,+,1024,/
  逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)(c+d)转换为ab+cd+
  它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
  如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
  将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
  (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
  (2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
  (3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
  (4)如果不是数字,该字符则是运算符,此时需比较优先关系。
  做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
  (5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
  下面是程序化算法流程:
  1、建立运算符栈stackOperator用于运算符的存储,压入'\0'。
  2、预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号) 。
  3、顺序扫描表达式,如果当前字符是数字(优先级为0的符号),则直接输出该数字;如果当前字符为运算符或括号(优先级不为0的符号),则判断第4点 。
  4、若当前运算符为'(',直接入栈;
  若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出;
  若为其它,比较stackOperator栈顶元素与当前元素的优先级:
  如果 栈顶元素 &= 当前元素,出栈并顺序输出运算符直到 栈顶元素 & 当前元素,然后当前元素入栈;
  如果 栈顶元素 & 当前元素,直接入栈。
  5、重复第3点直到表达式扫描完毕。
  6、顺序出栈并输出运算符直到栈顶元素为'\0'。
  各运算符及符号优先级:
  '\0': -1
  ')': 1
  '(': 2
  '+'、'-': 3
  '*'、'/'、'%': 4
  '^': 5
  其它: 0
* 计算逆波兰表达式的值
function calculate(RPolishArray){
var result = 0;
var tempArray = new Array(100);
var tempNum = -1;
for(i = 0;i & RPolishArray.i++){
if(RPolishArray[i].match(/\d/)){
tempNum++;
tempArray[tempNum] = RPolishArray[i];
switch(RPolishArray[i]){
result = (tempArray[tempNum-1] *1) + (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] =
result = (tempArray[tempNum-1] *1) - (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] =
result = (tempArray[tempNum-1] *1) * (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] =
result = (tempArray[tempNum-1] *1) / (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] =
result = tempArray[tempNum];
* 把普通算术表达式转换为逆波兰表达式
function toRPolish(input){
var regex = /(\(|\)|\+|\-|\*|\/)+/;
var array = input.split(regex);
var RPolish = ""
var SymbolArray = new Array(100);
var SymbolNum = -1;
for(j = 0;j & input.j++){
if(input.charAt(j).match(/\d/)){
if(isI == false){
RPolish += ','
RPolish += array[num];
if(SymbolNum == -1){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
if(input.charAt(j).match(/\(/)
|| SymbolArray[SymbolNum].match(/\(/)){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}else if(input.charAt(j).match(/\)/)){
while(!SymbolArray[SymbolNum].match(/\(/)){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolNum--;
SymbolNum--;
}else if(compare(input.charAt(j),SymbolArray[SymbolNum])){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}else if(!compare(input.charAt(j),SymbolArray[SymbolNum])){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolNum--;
if(SymbolNum &= 0){
if(SymbolArray[SymbolNum].match(/\(/)){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}else if(!compare(input.charAt(j),SymbolArray[SymbolNum])){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolArray[SymbolNum] = input.charAt(j);
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
while(SymbolNum &=0){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolNum--;
var RPolishArray = RPolish.split(regex);
return RPolishA
function compare(a,b){
if((a.match(/\*/)||a.match(/\//))&&(b.match(/\+/)||b.match(/\-/))){
从网上找来的例子
网上看到一个有图解释的应该会好理解
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这事其实和js关系不大,你先要知道“中缀表达式转后缀表达式然后求值”的原理,然后你就知道“如何用js实现中缀表达式转后缀表达式然后求值”了。
同步到新浪微博
不要错过该问题的后续解决方案
如果你没找到答案,记得登录关注哦,大家会尽全力帮你解决的 ^___^
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
举报理由:
推广(招聘、广告、SEO 等)方面的内容
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复(请编辑该提问指向已有相同问题)
内容质量差,或不适合在本网站出现
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:关于数据结构中的树的遍历请教一下题 算术表达式的中缀形式是a+b*c-d/e 后缀形式表示是 abc*+de/-求他的前缀 形式 是什么?+-a*bc/de既然后缀形式表示是 abc*+de/- 那根就因该是 -前缀形式第一个 _作业帮
拍照搜题,秒出答案
关于数据结构中的树的遍历请教一下题 算术表达式的中缀形式是a+b*c-d/e 后缀形式表示是 abc*+de/-求他的前缀 形式 是什么?+-a*bc/de既然后缀形式表示是 abc*+de/- 那根就因该是 -前缀形式第一个
关于数据结构中的树的遍历请教一下题 算术表达式的中缀形式是a+b*c-d/e 后缀形式表示是 abc*+de/-求他的前缀 形式 是什么?+-a*bc/de既然后缀形式表示是 abc*+de/- 那根就因该是 -前缀形式第一个 就应该是- 为什么答案是+开头呢?
答案是-+a*bc/de自己画了个不标准的图数据结构,中缀算术表达式,求后缀算术表达式,急急 急急急急急急急急,跪求高手指点,万分感激_百度知道
数据结构,中缀算术表达式,求后缀算术表达式,急急 急急急急急急急急,跪求高手指点,万分感激
40 10 8 -2 * + 16
_我想知道这个过程是怎样的啊:40+(10-8)*2 -16&#47?答案是这样的,已知一个中缀表达式为,请写出对应的后缀表达式;8题目是这样的,万分感激,希望高手给我讲解一下过程啊,求高手指点啊
提问者采纳
上说的都比较麻烦,你可以这样看,把刚才的式子加上40,然后再把(10-8)的结果乘以2,然后计算“-16&#47,就变成了 10 8 - 2 *(因为*2是在10-8的后面),应该先算(10-8),所以就是“10 8 -”在一起。另外“(”也不会出现在后缀表达式中,按照运算法则:首先你要知道一点就是中缀转为后缀时操作数的顺序是不会变的,在这个表达式中。然后,其实很简单,40 10 8 - 2 * +,然后算40+(10-8)*2;8“就得到了 40 10 8 - 2 * + 16 8 &#47
提问者评价
谢谢啊,万分感激,你们回答的都不错,你的采纳率比较高
其他类似问题
为您推荐:
其他1条回答
中序遍历,如果实在不会可以这样,把括号加上,然后每个运算符放在相应的括号的外面就是了;8))
你先按照优先级!40(+((10-8))*2))(-(16&#47,和后续遍历这个你必须先学会前序遍历,慢慢来
算术表达式的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁 上传我的文档
 下载
 收藏
各专业毕业设计论文,课程设计,设计方案,营销策划资料,部分毕业设计含有图纸,源代码,需求者可留言联系我
 下载此文档
正在努力加载中...
数据结构课程设计报告-中缀算术表达式求值
下载积分:1000
内容提示:数据结构课程设计报告-中缀算术表达式求值
文档格式:DOC|
浏览次数:65|
上传日期: 16:34:27|
文档星级:
该用户还上传了这些文档
数据结构课程设计报告-中缀算术表达式求值
官方公共微信

我要回帖

更多关于 数据结构后缀表达式 的文章

 

随机推荐