表达式的转换:
-
1.中缀表达式转前缀表达式或者后缀表达式
- 利用栈转换
-
2.后缀表达式转中缀表达式或者前缀表达式
- 直接构造表达式二叉树,得到表达式树根节点,然后中序遍历和前序遍历即可
-
3.前缀表达式转中缀表达式或者后缀表达式
- 直接构造表达式二叉树,得到表达式树根节点,然后中序遍历和后序遍历即可
-
准备工作:
- 定义表达式树结点类型
typedef struct BTNode{...}BTNode
- 1.中缀表达式转前缀表达式或者后缀表达式
stack<char> k1,k2//初始化一个操作数栈,一个操作符栈
- 2.后缀表达式转中缀表达式或者前缀表达式
stack<char> k3//初始化一个操作数栈
- 3.前缀表达式转中缀表达式或者后缀表达式
stack<char> k4//初始化一个操作数栈
-
接口声明:
- 1.中缀表达式转前缀表达式或者后缀表达式
int priority(char x)//返回运算符优先级大小,返回格式是int数字
string intopost(string in)//中缀转后缀
- 2.后缀表达式转中缀表达式或者前缀表达式
BTNode *posttree(string post)//后缀生成二叉树
- 3.前缀表达式转中缀表达式或者后缀表达式
BTNode *pretree(string post)//前缀生成二叉树
- 4.遍历函数
void preorder(BTNode *head);
void inorder(BTNode *head);
void postorder(BTNode *head);
-
算法核心:
- 1.1中缀表达式转后缀
从左到右扫描
- 操作符在以下情况时入操作符栈
-
操作符栈为空
-
栈顶为(
-
优先级大于栈顶
-
优先级小于栈顶时,把运算符栈顶元素弹到操作数栈直到能入栈为止