表达式翻译
- 格式:doc
- 大小:164.62 KB
- 文档页数:15
数据结构课程考核报告
表达式的翻译
学号:1515925610
姓名:李明慧
专业:软件工程专业
班级:15级云计算1班
指导教师:钱歌
南阳理工学院软件学院
2016年12月
目录
1.需求分析-------------------------------------------------------------------3 1.1问题描述---------------------------------------------------------------3
1.2基本要求---------------------------------------------------------------3
2.系统设计-------------------------------------------------------------------3
3.程序流程图-----------------------------------------------------------------4
4.类关系图-------------------------------------------------------------------6
5. 实现代码------------------------------------------------------------------7
6.个人总结-------------------------------------------------------------------7
7.参考书目-------------------------------------------------------------------7
一.需求分析
1.1问题描述
编写完整程序,将中缀表达式翻译成后缀表达式。表达式由操作数 ( 变量 ) 、操作 ( 运算符 ) 以及小括弧“(”和“)”组成,其中:(1)操作包括算术运算、关系运算和逻辑运算三类;(2)操作数为单个字符或由字母和数字任意多个字符构成;(3)能够识别出简单的错误,如括弧不匹配。
1.2 基本要求
输入:中缀表达式,80个字符以内。
输出:运算结果
功能:将中缀表达式转化为后缀表达式
二.系统设计
根据题目要求,将中缀表达式转化为后缀表达式。问题的解决方案有两种,分别是利用栈结构实现算数表达式的四则运算或者利用二叉树把中缀表达式转化为前缀表达式,我选择栈结构与树结构相结合来实现算数表达式的转化。
1.创建一棵二叉树,存储表达式中除左右括号之外的各个字符。
(1)创建两个栈sk1,sk2,其中sk1存储char类型的运算符,sk2存储自定
义类型的树。
(2)定义一个变量index用于遍历整个表达式,将其初始化为0。
(3)判断index所指的字符是操作数,运算符,还是左右括号。
<1>当index所指的字符ch为操作数时,将其压入栈sk2。之后index
继续遍历表达式下一个字符,直到ch==’\0’且栈sk1为空为止。
<2>当index所指字符ch为运算符’+’,’-’,’*’,’\’,’^’时,若ch
的优先级比栈sk1的栈顶元素优先级高或者栈sk1为空,就将index
所指字符ch压入栈sk1;否则就用栈sk1的栈顶元素创建一个树结
点,该结点的右孩子指向栈sk2的栈顶元素,之后让栈sk2的栈
顶元素出栈,此时该结点的左孩子指向栈sk2的栈顶元素,之后
让栈sk2的栈顶元素出栈,此时该结点的左右孩子都已确定,只
需将该结点压入栈sk2即可,之后index继续遍历表达式下一个
字符,直到ch==’\0’且栈sk1为空为止。
<3>当index所指字符ch为左括号’(’时,将其压入栈sk1,之后
index继续遍历表达式下一个字符,直到ch==’\0’且栈sk1为空为止.
<4>当index所指字符ch为右括号’)’时,若栈sk1的栈顶元素不
是左括号’(’,就用栈sk1的栈顶元素创建一个树结点,该结点的右
孩子指向栈sk2的栈顶元素,之后让栈sk2的栈顶元素出栈,此时
该结点的左孩子指向栈sk2 的栈顶元素,之后让栈sk2 的栈顶元
素出栈,此时该结点的左右孩子都已确定,只需将该结点压入栈
sk2即可;如此循环,直到栈sk1的栈顶元素是左括号’(’时,为
止。之后index继续遍历表达式下一个字符,直到ch==’\0’且栈sk1为空为止.
(4)当栈sk1为空且表达式遍历结束时停止循环判断,将栈sk2中的树
根指针p出栈,此时即创建了一棵树,且树的根指针为p。
2.画树:利用递归遍历整棵树的方式,从右往左依次将树的右子树,根结点
和左子树上的字符输出即可。
3.后序输出表达式:利用递归的方式后序遍历二叉树,依次输出树结点的字符
即可。
4.删除树结点:利用递归的方式遍历二叉树,当树结点的左右子树均为空时,
删除此结点,最终将整棵树的结点都删除,释放所有树结点所占的内存。三.程序流程图
四.类关系图
(1)头文件
#include
#include
#include
#include
using namespace std;
(2)创建一个类存储二叉树的结点
class Tree_Node
{
public:
char oper;
Tree_Node *left;
Tree_Node *right;
Tree_Node(char op)
{
left=right=NULL;
oper=op;
}
};
(3)主函数
int main()
{
int test;
string s;
Tree_Node *tree;
cout<<"【请输入需要转换的表达式个数:】"< cin>>test; while(test--) { cout<<"\n【请输入一个中缀表达式:】"< cin>>s; build_Tree(tree,s); cout<<"\n【建好的表达式树:】"< draw_Tree(0,tree); cout<<"\n【转换之后的后缀表达式为:】"< post_order(tree); cout< free_Tree(tree); cout< } return 0; }