将表达式转化为二叉树
2016-04-30 15:56
411 查看
本来挺简单一个问题结果折腾了有几天。
网上也没有比较合理的答案。
需要两个栈,一个栈存储操作符,另一个栈存储树或者节点。
代码如下:
main:
#include"Expression_bitree.h"
Status print(Data i)
{
using namespace std;
if (i.ischar)
cout << (char)i.data;
else
cout << i.data;
system("pause");
return OK;
}
int main()
{
using namespace std;
BiTree pine = NULL;
CreateBiTree(pine, "1+2*(3-4)-5/6");
cout << "create finished" << endl;
system("pause");
PreOrderTraverse(pine, print);
system("pause");
}
Stack.h:
#ifndef STACK_H_
#define STACK_H_
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5
#ifndef Status
#define Status int
#define OK 1
#define ERROR 0
#define OVERFLOW 2
#endif
#include<cstdlib>
#include<malloc.h>
template<class sElemType>
class Stack
{
private:
sElemType* base;
sElemType* top;
int stacksize;
public:
Stack();
~Stack();
Status ClearStack();
bool StackEmpty();
int StackLength() { return stacksize; }
Status GetTop(sElemType & e);
Status Push(sElemType e);
Status Pop(sElemType & e);
Status StackTraverse(Status(*visit)(sElemType t));
};
template<class sElemType>
Stack<sElemType>::Stack()
{
base = (sElemType*)malloc(STACK_INIT_SIZE*sizeof(sElemType));
if (!base) exit(OVERFLOW);
top = base;
stacksize = STACK_INIT_SIZE;
}
template<class sElemType>
Status Stack<sElemType>::GetTop(sElemType & e)
{
if (top == base) return ERROR;
e = *(top - 1);
return OK;
}
template<class sElemType>
Status Stack<sElemType>::Push(sElemType e)
{
if (top - base >= stacksize)
{
base = (sElemType*)realloc(base, sizeof(sElemType)*(stacksize + STACKINCREMENT));
if (!base) exit(OVERFLOW);
top = base + STACKINCREMENT;
stacksize += STACKINCREMENT;
}
*top++ = e;
return OK;
}
template<class sElemType>
Status Stack<sElemType>::Pop(sElemType & e)
{
if (top == base) return ERROR;
e = *(--top);
return OK;
}
template<class sElemType>
Status Stack<sElemType>::ClearStack()
{
if (stacksize)
{
free(base);
base = NULL;
top = NULL;
stacksize = 0;
}
return OK;
}
template<class sElemType>
bool Stack<sElemType>::StackEmpty()
{
return top == base;
}
template<class sElemType>
Stack<sElemType>::~Stack()
{
ClearStack();
}
template<class sElemType>
Status Stack<sElemType>::StackTraverse(Status(*visit)(sElemType t))
{
for (int i = 0; i < stacksize; i++)
{
Status temp = visit(base[stacksize - i]);
if (temp == ERROR) return ERROR;
}
}
#endif
Expression_bitree.h:
#ifndef EXPRESSION_BITREE_H_
#define EXPRESSION_BITREE_H_
#include"Stack.h"
#include<cctype>
#include<iostream>
typedef struct Data {
bool ischar;
int data;
};
typedef struct BiTNode {
Data data;
struct BiTNode * lchild, *rchild;
} *BiTree;
Status CreateBiTree(BiTree & T, char* item);
Status PreOrderTraverse(BiTree & T, Status(*visit)(Data e));
#endif
expression_bitree.cpp:
#include"Expression_bitree.h"
//工具函数
int get_priority(char t)
{
switch(t)
{
case '(':return 4;
case ')':return 1;
case '+':return 2;
case '-':return 2;
case '*':return 3;
case '/':return 3;
}
}
char priority(char a, char b)
{
if (get_priority(a) > get_priority(b))
return '>';
else if (get_priority(a) == get_priority(b))
return '=';
else return '<' ;
}
Status ReadNumber(char* & item, int & num)
{
Stack <char>temp;
int power = 1;
num = 0;
if (!item)
return ERROR;
while (isdigit(*item))
{
temp.Push(*item);
item++;
}
while (!temp.StackEmpty())
{
char tempchar;
if (!temp.Pop(tempchar)) return ERROR;
num += power * (tempchar - 48);
power *= 10;
}
return OK;
}
Status CreateBiTree(BiTree & T, int item)
{
if (T != NULL)
return ERROR;
else
{
if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
{
T->data.ischar = false;
T->data.data = item;
T->lchild = NULL;
T->rchild = NULL;
}
}
return OK;
}
Status CreateBiTree(BiTree & T, char item)
{
if (T != NULL)
return ERROR;
else
{
if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
{
T->data.ischar = true;
T->data.data = item;
T->lchild = NULL;
T->rchild = NULL;
}
}
return OK;
}
//接口函数
Status CreateBiTree(BiTree & T, char* item)
{
//检查T为空,item非空
if (!item)
return ERROR;
if (T)
return ERROR;
//检查是否已经到了字符串尾
if (!(*item)) return OK;
//申请内存空间,指针置空
if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->lchild = NULL;
T->rchild = NULL;
//申请操作符栈,树栈
Stack <char>operator_stack;
Stack <BiTree>tree_stack;
//如果有括号,优先进行括号操作
while (*item)
{
//判断是不是数
char* tempItem = item;
int num;
if (isdigit(*item))
{
ReadNumber(item, num);
BiTree tempTree = NULL;
CreateBiTree(tempTree, num);
tree_stack.Push(tempTree);
}
//如果不是数那就是操作符了
else
{
//栈空,则压入
if (operator_stack.StackEmpty())
{
operator_stack.Push(*item);
item++;
}
//栈非空,则比较优先级
else
{
char tempChara;
operator_stack.GetTop(tempChara);
switch (priority(*item, tempChara))
{
case '>': {
operator_stack.Push(*item);
item++;
break;
}
case '=':
{
}
case '<':
{
//对括号单独处理
if (*item == ')')
{
char tempChar;
operator_stack.Pop(tempChar);
while (tempChar != '(')
{
BiTree tempTree = NULL;
BiTree tempTree2;
if (!(tempTree = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
tree_stack.Pop(tempTree2);
tempTree->data.ischar = true;
tempTree->data.data = tempChar;
tempTree->lchild = tempTree2;
tree_stack.Pop(tempTree2);
tempTree->rchild = tempTree2;
tree_stack.Push(tempTree);
operator_stack.Pop(tempChar);
}
item++;
}
else
{
char m = *item;
while (priority(*item, m)!='>'&&(tempChara != '(')&&!operator_stack.StackEmpty())
{
BiTree tempTree = NULL;
BiTree tempTree2;
char tempChar;
i
961f
f (!(tempTree = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
tempTree->data.ischar = true;
operator_stack.Pop(tempChar);
tempTree->data.data = tempChar;
tree_stack.Pop(tempTree2);
tempTree->lchild = tempTree2;
tree_stack.Pop(tempTree2);
tempTree->rchild = tempTree2;
tree_stack.Push(tempTree);
operator_stack.GetTop(m);
}
operator_stack.Push(*item);
item++;
}
}
break;
}
}
}
}
std::cout << "t\n";
while (!operator_stack.StackEmpty())
{
BiTree tempTree = NULL;
BiTree tempTree2;
char tempChar;
if (!(tempTree = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
tempTree->data.ischar = true;
operator_stack.Pop(tempChar);
tempTree->data.data = tempChar;
tree_stack.Pop(tempTree2);
tempTree->lchild = tempTree2;
tree_stack.Pop(tempTree2);
tempTree->rchild = tempTree2;
tree_stack.Push(tempTree);
}
tree_stack.Pop(T);
}
Status PreOrderTraverse(BiTree & T, Status(*visit)(Data e))
{
if (T)
{
if (visit(T->data))
{
if (PreOrderTraverse(T->lchild, visit))
if (PreOrderTraverse(T->rchild, visit)) return OK;
return ERROR;
}
}
else
{
return OK;
}
}
注意对于操作符优先级,括号的特殊处理。
网上也没有比较合理的答案。
需要两个栈,一个栈存储操作符,另一个栈存储树或者节点。
代码如下:
main:
#include"Expression_bitree.h"
Status print(Data i)
{
using namespace std;
if (i.ischar)
cout << (char)i.data;
else
cout << i.data;
system("pause");
return OK;
}
int main()
{
using namespace std;
BiTree pine = NULL;
CreateBiTree(pine, "1+2*(3-4)-5/6");
cout << "create finished" << endl;
system("pause");
PreOrderTraverse(pine, print);
system("pause");
}
Stack.h:
#ifndef STACK_H_
#define STACK_H_
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5
#ifndef Status
#define Status int
#define OK 1
#define ERROR 0
#define OVERFLOW 2
#endif
#include<cstdlib>
#include<malloc.h>
template<class sElemType>
class Stack
{
private:
sElemType* base;
sElemType* top;
int stacksize;
public:
Stack();
~Stack();
Status ClearStack();
bool StackEmpty();
int StackLength() { return stacksize; }
Status GetTop(sElemType & e);
Status Push(sElemType e);
Status Pop(sElemType & e);
Status StackTraverse(Status(*visit)(sElemType t));
};
template<class sElemType>
Stack<sElemType>::Stack()
{
base = (sElemType*)malloc(STACK_INIT_SIZE*sizeof(sElemType));
if (!base) exit(OVERFLOW);
top = base;
stacksize = STACK_INIT_SIZE;
}
template<class sElemType>
Status Stack<sElemType>::GetTop(sElemType & e)
{
if (top == base) return ERROR;
e = *(top - 1);
return OK;
}
template<class sElemType>
Status Stack<sElemType>::Push(sElemType e)
{
if (top - base >= stacksize)
{
base = (sElemType*)realloc(base, sizeof(sElemType)*(stacksize + STACKINCREMENT));
if (!base) exit(OVERFLOW);
top = base + STACKINCREMENT;
stacksize += STACKINCREMENT;
}
*top++ = e;
return OK;
}
template<class sElemType>
Status Stack<sElemType>::Pop(sElemType & e)
{
if (top == base) return ERROR;
e = *(--top);
return OK;
}
template<class sElemType>
Status Stack<sElemType>::ClearStack()
{
if (stacksize)
{
free(base);
base = NULL;
top = NULL;
stacksize = 0;
}
return OK;
}
template<class sElemType>
bool Stack<sElemType>::StackEmpty()
{
return top == base;
}
template<class sElemType>
Stack<sElemType>::~Stack()
{
ClearStack();
}
template<class sElemType>
Status Stack<sElemType>::StackTraverse(Status(*visit)(sElemType t))
{
for (int i = 0; i < stacksize; i++)
{
Status temp = visit(base[stacksize - i]);
if (temp == ERROR) return ERROR;
}
}
#endif
Expression_bitree.h:
#ifndef EXPRESSION_BITREE_H_
#define EXPRESSION_BITREE_H_
#include"Stack.h"
#include<cctype>
#include<iostream>
typedef struct Data {
bool ischar;
int data;
};
typedef struct BiTNode {
Data data;
struct BiTNode * lchild, *rchild;
} *BiTree;
Status CreateBiTree(BiTree & T, char* item);
Status PreOrderTraverse(BiTree & T, Status(*visit)(Data e));
#endif
expression_bitree.cpp:
#include"Expression_bitree.h"
//工具函数
int get_priority(char t)
{
switch(t)
{
case '(':return 4;
case ')':return 1;
case '+':return 2;
case '-':return 2;
case '*':return 3;
case '/':return 3;
}
}
char priority(char a, char b)
{
if (get_priority(a) > get_priority(b))
return '>';
else if (get_priority(a) == get_priority(b))
return '=';
else return '<' ;
}
Status ReadNumber(char* & item, int & num)
{
Stack <char>temp;
int power = 1;
num = 0;
if (!item)
return ERROR;
while (isdigit(*item))
{
temp.Push(*item);
item++;
}
while (!temp.StackEmpty())
{
char tempchar;
if (!temp.Pop(tempchar)) return ERROR;
num += power * (tempchar - 48);
power *= 10;
}
return OK;
}
Status CreateBiTree(BiTree & T, int item)
{
if (T != NULL)
return ERROR;
else
{
if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
{
T->data.ischar = false;
T->data.data = item;
T->lchild = NULL;
T->rchild = NULL;
}
}
return OK;
}
Status CreateBiTree(BiTree & T, char item)
{
if (T != NULL)
return ERROR;
else
{
if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
{
T->data.ischar = true;
T->data.data = item;
T->lchild = NULL;
T->rchild = NULL;
}
}
return OK;
}
//接口函数
Status CreateBiTree(BiTree & T, char* item)
{
//检查T为空,item非空
if (!item)
return ERROR;
if (T)
return ERROR;
//检查是否已经到了字符串尾
if (!(*item)) return OK;
//申请内存空间,指针置空
if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->lchild = NULL;
T->rchild = NULL;
//申请操作符栈,树栈
Stack <char>operator_stack;
Stack <BiTree>tree_stack;
//如果有括号,优先进行括号操作
while (*item)
{
//判断是不是数
char* tempItem = item;
int num;
if (isdigit(*item))
{
ReadNumber(item, num);
BiTree tempTree = NULL;
CreateBiTree(tempTree, num);
tree_stack.Push(tempTree);
}
//如果不是数那就是操作符了
else
{
//栈空,则压入
if (operator_stack.StackEmpty())
{
operator_stack.Push(*item);
item++;
}
//栈非空,则比较优先级
else
{
char tempChara;
operator_stack.GetTop(tempChara);
switch (priority(*item, tempChara))
{
case '>': {
operator_stack.Push(*item);
item++;
break;
}
case '=':
{
}
case '<':
{
//对括号单独处理
if (*item == ')')
{
char tempChar;
operator_stack.Pop(tempChar);
while (tempChar != '(')
{
BiTree tempTree = NULL;
BiTree tempTree2;
if (!(tempTree = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
tree_stack.Pop(tempTree2);
tempTree->data.ischar = true;
tempTree->data.data = tempChar;
tempTree->lchild = tempTree2;
tree_stack.Pop(tempTree2);
tempTree->rchild = tempTree2;
tree_stack.Push(tempTree);
operator_stack.Pop(tempChar);
}
item++;
}
else
{
char m = *item;
while (priority(*item, m)!='>'&&(tempChara != '(')&&!operator_stack.StackEmpty())
{
BiTree tempTree = NULL;
BiTree tempTree2;
char tempChar;
i
961f
f (!(tempTree = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
tempTree->data.ischar = true;
operator_stack.Pop(tempChar);
tempTree->data.data = tempChar;
tree_stack.Pop(tempTree2);
tempTree->lchild = tempTree2;
tree_stack.Pop(tempTree2);
tempTree->rchild = tempTree2;
tree_stack.Push(tempTree);
operator_stack.GetTop(m);
}
operator_stack.Push(*item);
item++;
}
}
break;
}
}
}
}
std::cout << "t\n";
while (!operator_stack.StackEmpty())
{
BiTree tempTree = NULL;
BiTree tempTree2;
char tempChar;
if (!(tempTree = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
tempTree->data.ischar = true;
operator_stack.Pop(tempChar);
tempTree->data.data = tempChar;
tree_stack.Pop(tempTree2);
tempTree->lchild = tempTree2;
tree_stack.Pop(tempTree2);
tempTree->rchild = tempTree2;
tree_stack.Push(tempTree);
}
tree_stack.Pop(T);
}
Status PreOrderTraverse(BiTree & T, Status(*visit)(Data e))
{
if (T)
{
if (visit(T->data))
{
if (PreOrderTraverse(T->lchild, visit))
if (PreOrderTraverse(T->rchild, visit)) return OK;
return ERROR;
}
}
else
{
return OK;
}
}
注意对于操作符优先级,括号的特殊处理。
相关文章推荐
- 谈谈对Spring IOC的理解
- kernel_require.rb:55:in `require': cannot load such file
- Nodejs 大文件 MD5签名
- 无限轮播器
- 逆波兰表达式
- 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现
- Java应用架构的演化之路
- Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图
- 矩阵快速幂算法+列题(HDU 5667 Sequence)
- 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现
- 每天一个linux命令:top
- 自考总结
- 【Spring进阶】spring对AOP的支持-注解方式和配置方式
- 3月30日作业
- 架构的本质
- 详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题(转)
- 第九周学习进度情况
- 【Struts】Struts2简介及实现用户登录代码示例
- 常见的USB VID
- leetcode——121——Best Time to Buy and Sell Stock