表达式转二叉树的C++源代码
来源:互联网 发布:网络推广年度计划 编辑:程序博客网 时间:2024/06/05 07:25
2008-05-04 10:47
本程序在VC上调试运行无错误!
#include <iostream>
#include <stack>
#include <string>
using namespace std;
class Node
{
public:
char oper;//操作数或运算符
Node *left;//左子树
Node *right;//右子树
Node()
{
left=right=NULL;
oper=0;
}
Node(char op)
{
left=right=NULL;
oper=op;
}
};
bool isOper(char op)
{//判断是否为运算符
char oper[]={'(',')','+','-','*','/','^'};
for(int i=0;i<sizeof(oper);i++)
{
if(op==oper[i])
{
return true;
}
}
return false;
}
int getOperPri(char op)
{//求运算符的优先级
switch(op)
{
case '(':
return 1;
case '+':
case '-':
return 2;
case '*':
case '/':
return 3;
case '^':
return 4;
default:
return 0;
}
}
inline void freeTree(Node *p)
{//销毁二叉树
if(p->left!=NULL)
{
freeTree(p->left);
}
if(p->right!=NULL)
{
freeTree(p->right);
}
delete(p);
}
void postOrderTraverse(Node *p)
{//后序遍历
if(p)
{
postOrderTraverse(p->left);
postOrderTraverse(p->right);
cout<<p->oper;
}
}
void preOrderTraverse(Node *p)
{//先序遍历
if(p)
{
cout<<p->oper;
preOrderTraverse(p->left);
preOrderTraverse(p->right);
}
}
void inOrderTraverse(Node *p)
{//中序遍历
if(p)
{
if(p->left)
{
if(isOper(p->left->oper)
&& getOperPri(p->left->oper)
<getOperPri(p->oper))
{
cout<<"(";
inOrderTraverse(p->left);
cout<<")";
}
else
{
inOrderTraverse(p->left);
}
}
cout<<p->oper;
if(p->right)
{
if(isOper(p->right->oper)
&& getOperPri(p->right->oper)
<=getOperPri(p->oper))
{
cout<<"(";
inOrderTraverse(p->right);
cout<<")";
}
else
{
inOrderTraverse(p->right);
}
}
}
}
void generateTree(Node *&p, string expr)
{//生成二叉树
stack <char> operStack;
stack <Node*> dataStack;
char tmpchr,c;
int idx=0;
tmpchr=expr[idx++];
while(operStack.size()!=0 || tmpchr!='\0')
{
if(tmpchr!='\0' && !isOper(tmpchr))
{//不是运算符,则进操作数的栈
p=new Node(tmpchr);
dataStack.push(p);
tmpchr=expr[idx++];
}
else
{
switch(tmpchr)
{
case '('://进栈
operStack.push('(');
tmpchr=expr[idx++];
break;
case ')'://脱括号
while(true)
{
c=operStack.top();
operStack.pop();
if(c=='(')
{
break;
}
p=new Node(c);
if(dataStack.size())
{
p->right=dataStack.top();
dataStack.pop();
}
if(dataStack.size())
{
p->left=dataStack.top();
dataStack.pop();
}
dataStack.push(p);
}
tmpchr=expr[idx++];
break;
default:
if(operStack.size()==0 || tmpchr!='\0'
&& getOperPri(operStack.top())
< getOperPri(tmpchr))
{//进栈
operStack.push(tmpchr);
tmpchr=expr[idx++];
}
else
{//出栈
p=new Node(operStack.top());
p->oper=operStack.top();
if(dataStack.size())
{
p->right=dataStack.top();
dataStack.pop();
}
if(dataStack.size())
{
p->left=dataStack.top();
dataStack.pop();
}
dataStack.push(p);
operStack.pop();
}
break;
}
}
}
p=dataStack.top();
dataStack.pop();
}
int main()
{
int testCaseNum;
string expression;
Node *tree;
cout<<"请输入测试用例的数目:";
cin>>testCaseNum;
while(testCaseNum--)
{
cout<<endl<<"请输入字符串表达式:";
cin>>expression;
generateTree(tree,expression);
cout<<"中缀表达式为:";
inOrderTraverse(tree);
cout<<endl;
cout<<"前缀表达式为:";
preOrderTraverse(tree);
cout<<endl;
cout<<"后缀表达式为:";
postOrderTraverse(tree);
cout<<endl;
freeTree(tree);
}
return 0;
}
- 表达式转二叉树的C++源代码
- 二叉树的基本操作C源代码
- C:算数表达式转二叉树
- 基于二叉树的表达式计算-C语言
- 表达式转二叉树
- 二叉树的各种操作_源代码
- C语言-数据结构-线索二叉树-生成、遍历源代码
- c的二叉树
- C-源代码-计算简单表达式
- 二叉树源代码
- 二叉树实现源代码
- C语言实现二叉树的建立、遍历以及表达式的计算
- 表达式树(二叉树)的实现
- 表达式树 (二叉树的应用)
- 二叉树的简单应用--表达式树
- 二叉树 表达式树的值 .
- 二叉树::表达式的前中后遍历
- 表达式与二叉树之间的转换
- C#语言版下载者代码分享。本人才疏学浅,抛砖引玉,欢迎大牛指导。
- Android的PackageManager和ActivityManager的功能简介
- WCF创建WebService正确操作步骤详解
- MyEclipse中分别通过buildpath和lib导入jar包的区别
- Virtualbox虚拟机Ubuntu共享文件夹设置 自动挂载
- 表达式转二叉树的C++源代码
- binary tree(basic operation)
- html5游戏开发-愤怒的小鸟-开源讲座(一)-跳入弹出的小鸟
- Android中调用系统所装的软件打开文件
- .text, .data , .bss, .constdata, stack, heap; RO, RW, ZI
- <FZU 1019>猫捉老鼠
- zen-cart开发教程 - 概述
- SQL 中各种连接的区别
- Scala学习笔记(九) - 包和引用