前缀转后缀(表达式)

问题描述:

  前缀表达式转成后缀表达式,示例:

  * + 4 2 + 3 6 => 4 2 + 3 6 + *

思路(树):

  1. 从左往右扫描串

  2. 遇到操作符则递归构造树节点,当前操作符是根节点,并递归构造左右子节点

  3. 后序遍历当前结果,并返回

代码:

 1 #include <string>
 2 #include <sstream>
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 string input_str = "* + 4.3 2 + 3.5 6.2";
 8 int ind = 0;
 9
10 //树结构
11 typedef struct BinaryTreeNode
12 {
13     string cur_str;
14     BinaryTreeNode *left;
15     BinaryTreeNode *right;
16     BinaryTreeNode(string _cur_str)
17     {
18         cur_str = _cur_str;
19         left = NULL;
20         right = NULL;
21     }
22 } BNode_t;
23
24 //后序遍历树
25 void post_traverse(BNode_t *root, string &post_str)
26 {
27     if( root == NULL )
28         return;
29     post_traverse(root->left, post_str);
30     post_traverse(root->right, post_str);
31     if( post_str != "" )
32         post_str += " " + root->cur_str;
33     else
34         post_str = root->cur_str;
35 }
36
37 //得到下一个
38 string get_next()
39 {
40     string next = "";
41     for(; ind < input_str.size(); ind++)
42     {
43         if( input_str[ind] != ‘ ‘ )
44             next += input_str[ind];
45         else
46             break;
47     }
48     ind++;
49     return next;
50 }
51
52 //转换:递归构造树,并后序遍历
53 string transform()
54 {
55     string post_str;
56     string next = get_next();
57     if( ! isdigit(next[0]) )
58     {
59         BNode_t *root = new BNode_t(next);
60         root->left = new BNode_t( transform() );
61         root->right = new BNode_t( transform() );
62         post_traverse(root, post_str);
63         delete root->left;
64         delete root->right;
65         delete root;
66         return post_str;
67     }
68     else return next;
69 }
70
71
72 int main()
73 {
74     cout << transform() << endl;
75     return 0;
76 }

转载请注明引用自:

  http://www.cnblogs.com/breakthings/p/4053444.html

时间: 2024-09-29 05:39:23

前缀转后缀(表达式)的相关文章

中缀、前缀、后缀表达式的转换

中缀表达式:a+b*c-(d+e) 第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e)) 第二步:转换前缀与后缀表达式 前缀(波兰式):把运算符号移动到对应的括号前面 则变成了:-( +(a *(bc)) +(de)) 把括号去掉:-+a*bc+de 前缀式子出现 后缀(逆波兰式):把运算符号移动到对应的括号后面 则变成了:((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+- 后缀式子出现

中缀表达式转前缀和后缀表达式

中缀转前缀 #ifndef POSTFIX_TO_NIFIXEXPRESS_H #define POSTFIX_TO_NIFIXEXPRESS_H #include<iostream> #include<string> #include<stack> /************************************************************************/ /* 中缀表达式转前缀表达式 建立一个栈来保存运算符,和一个字符容器存字

中缀、前缀和后缀表达式

我们学习的算法中的表达式有中缀.前缀和后缀之分,到底有什么区别呢? 中缀(INFIX) 中缀表达式(infix expression)可以是单个变量,或两个变量以及中间的操作符. AA + B(A + B) + (C – D) 前缀(PREFIX) 前缀表达式(prefix expression)可以是单个变量,一个操作符,后面跟两个操作数,每个前缀表达式包括一个操作符和两个操作数. A+ A B+ + A B – C D 后缀(POSTFIX) 后缀表达式(postfix expression

前缀 中缀 后缀表达式

1.前缀表达式叫波兰式,后缀叫逆波兰式 2.中缀表达式转另外两个比较简单,前后缀装中缀较麻烦 3.问题分求表达式还是求值,如果是求值则需要两个栈,一个是操作符栈,一个是操作数栈,等操作符栈入栈完毕后依次出栈,并把操作数栈顶两个操作数计算并将 结果重新压入栈 4.只有中缀表达式有括号一说,波兰式和逆波兰式的运算顺序严格定义,不需要括号 5.计算机并没有中缀计算能力,需转化为波兰式或逆波兰式 6.波兰式和逆波兰式转中缀的编程题还没见到,只见到填空题有,可能因为计算机更需要的是波兰式和逆波兰式 7.中

数据结构笔试:前缀表达式|后缀表达式

这里我给出一个中缀表达式:a+b*c-(d+e) 第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e)) 第二步:转换前缀与后缀表达式 前缀:把运算符号移动到对应的括号前面 则变成了:-( +(a *(bc)) +(de)) 把括号去掉:-+a*bc+de 前缀式子出现 后缀:把运算符号移动到对应的括号后面 则变成了:((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+- 后缀式子出现 so easy~

前缀、中缀、后缀表达式

先举例: (3 + 4) × 5 - 6 中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式 以前没见过前缀和后缀表达式,感觉一下刷新了知识库!原来在计算机里早已司空见惯了…… 完了,一下暴露非科班出身了……不扯了,下面这篇文章对这三种表达式介绍的很不错,特拿来分享下! 地址:http://blog.csdn.net/antineutrino/article/details/6763722

【转】前缀、中缀、后缀表达式

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计

中缀表达式转换成前缀表达式和后缀表达式

35,15,+,80,70,-,*,20,/                   //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式 /,*,+,35,15,-,80,70, 20                 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我

java四则运算----前缀、中缀、后缀表达式

接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现有点复杂,然后各种for,感觉非常不爽,于是问网上搜了下,发现一种叫波兰式的计算方法,瞬间茅塞顿开. http://blog.csdn.net/antineutrino/article/details/6763722 以下为原文引用 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.

算术表达式的前缀表达式,中缀表达式和后缀表达式

这里所谓的前缀,中缀,后缀是根据操作符的位置来定的,如果操作符在操作数前面,则称为前缀表达式,例如"- + 1 × + 2 3 4 5";如果操作符在操作数之间,则称为中缀表达式,例如 "1+((2+3)×4)-5";如果操作符在操作数后面,则称为后缀表达式,例如"1 2 3 + 4 × + 5 -". 虽然中缀表达式符合人类的日常思维习惯,但是计算机在存储中缀表达式时,需要使用树这种数据结构,如果表达式过于复杂,那么树的高度会变得很高,大大增加