🐛 (#18)修复习题6.51在父操作符与右孩子操作符优先级相同时不会添加括号的BUG

This commit is contained in:
康建伟
2020-04-08 11:39:36 +08:00
parent 8baea43314
commit 5b0d3a181b
10 changed files with 29 additions and 92 deletions

View File

@@ -1 +1 @@
ÏÈÐòÐòÁСú*/*+a^^b^^-c^^d^^e^^-g^^h^^
ÏÈÐòÐòÁСú*/-+a^^b^^-c^^d^^e^^-g^^h^^

View File

@@ -5,7 +5,6 @@
/* 函数原型 */
void Algo_6_51(BiTree T);
Status IsOperator_6_51(char c);
Status LowPriority_6_51(char a, char b);
int main(int argc, char *argv[])
{
@@ -38,9 +37,10 @@ void Algo_6_51(BiTree T)
if(T)
{
if(T->lchild)
{
if(IsOperator_6_51(T->lchild->data) && LowPriority_6_51(T->lchild->data, T->data))
{ //当前结点的左孩子是操作符且优先级低于当前结点
{
// 左子树是表达式,则添加括号
if(IsOperator_6_51(T->lchild->data))
{
printf("(");
Algo_6_51(T->lchild);
printf(")");
@@ -53,8 +53,9 @@ void Algo_6_51(BiTree T)
if(T->rchild)
{
if(IsOperator_6_51(T->rchild->data) && LowPriority_6_51(T->rchild->data, T->data))
{ //当前结点的右孩子是操作符且优先级低于当前结点
// 右子树是表达式,则添加括号
if(IsOperator_6_51(T->rchild->data))
{
printf("(");
Algo_6_51(T->rchild);
printf(")");
@@ -72,11 +73,3 @@ Status IsOperator_6_51(char c) //
else
return ERROR;
}
Status LowPriority_6_51(char a, char b) //确定操作符a的优先级是否低于b
{
if((a=='+' || a=='-') && (b=='*' || b=='/'))
return TRUE;
else //a与b同等级时也视为a的优先级较高
return ERROR;
}

View File

@@ -10,9 +10,6 @@ void Algo_6_51(BiTree T);
// 判断字符c是否为操作符
Status IsOperator(char c);
// 判断两个操作符的优先级
Status Priority(char a, char b);
int main(int argc, char* argv[]) {
BiTree T;
@@ -40,8 +37,8 @@ void Algo_6_51(BiTree T) {
}
if(T->lchild != NULL) {
// 当前结点的左孩子是操作符且优先级低于当前结点
if(IsOperator(T->lchild->data) && Priority(T->lchild->data, T->data) < 0) {
// 左子树是表达式,则添加括号
if(IsOperator(T->lchild->data)) {
printf("(");
Algo_6_51(T->lchild);
printf(")");
@@ -53,8 +50,8 @@ void Algo_6_51(BiTree T) {
printf("%c", T->data);
if(T->rchild != NULL) {
// 当前结点的右孩子是操作符且优先级低于当前结点
if(IsOperator(T->rchild->data) && Priority(T->rchild->data, T->data) < 0) {
// 右子树是表达式,则添加括号
if(IsOperator(T->rchild->data)) {
printf("(");
Algo_6_51(T->rchild);
printf(")");
@@ -72,19 +69,3 @@ Status IsOperator(char c) {
return ERROR;
}
}
// 判断两个操作符的优先级
Status Priority(char a, char b) {
// a的优先级低
if((a == '+' || a == '-') && (b == '*' || b == '/')) {
return -1;
// a的优先级高
} else if((a == '*' || a == '/') && (b == '+' || b == '-')) {
return 1;
// 优先级相同
} else {
return 0;
}
}

View File

@@ -1 +1 @@
先序序列→*/*+a^^b^^-c^^d^^e^^-g^^h^^
先序序列→*/-+a^^b^^-c^^d^^e^^-g^^h^^

View File

@@ -10,23 +10,20 @@ void Algo_6_51(BiTree T);
// 判断字符c是否为操作符
Status IsOperator(char c);
// 判断两个操作符的优先级
Status Priority(char a, char b);
int main(int argc, char* argv[]) {
BiTree T;
printf("创建二叉树先序序列T...\n");
InitBiTree(&T);
CreateBiTree(&T, "TestData.txt");
PrintTree(T);
printf("\n");
printf("输出算术表达式:");
Algo_6_51(T);
printf("\n");
return 0;
}
@@ -38,10 +35,10 @@ void Algo_6_51(BiTree T) {
if(T == NULL) {
return;
}
if(T->lchild != NULL) {
// 当前结点的左孩子是操作符且优先级低于当前结点
if(IsOperator(T->lchild->data) && Priority(T->lchild->data, T->data) < 0) {
// 左子树是表达式,则添加括号
if(IsOperator(T->lchild->data)) {
printf("(");
Algo_6_51(T->lchild);
printf(")");
@@ -49,12 +46,12 @@ void Algo_6_51(BiTree T) {
Algo_6_51(T->lchild);
}
}
printf("%c", T->data);
if(T->rchild != NULL) {
// 当前结点的右孩子是操作符且优先级低于当前结点
if(IsOperator(T->rchild->data) && Priority(T->rchild->data, T->data) < 0) {
// 右子树是表达式,则添加括号
if(IsOperator(T->rchild->data)) {
printf("(");
Algo_6_51(T->rchild);
printf(")");
@@ -73,18 +70,3 @@ Status IsOperator(char c) {
}
}
// 判断两个操作符的优先级
Status Priority(char a, char b) {
// a的优先级低
if((a == '+' || a == '-') && (b == '*' || b == '/')) {
return -1;
// a的优先级高
} else if((a == '*' || a == '/') && (b == '+' || b == '-')) {
return 1;
// 优先级相同
} else {
return 0;
}
}

View File

@@ -1 +1 @@
ÏÈÐòÐòÁСú*/*+a^^b^^-c^^d^^e^^-g^^h^^
ÏÈÐòÐòÁСú*/-+a^^b^^-c^^d^^e^^-g^^h^^

View File

@@ -10,9 +10,6 @@ void Algo_6_51(BiTree T);
// 判断字符c是否为操作符
Status IsOperator(char c);
// 判断两个操作符的优先级
Status Priority(char a, char b);
int main(int argc, char* argv[]) {
BiTree T;
@@ -40,8 +37,8 @@ void Algo_6_51(BiTree T) {
}
if(T->lchild != NULL) {
// 当前结点的左孩子是操作符且优先级低于当前结点
if(IsOperator(T->lchild->data) && Priority(T->lchild->data, T->data) < 0) {
// 左子树是表达式,则添加括号
if(IsOperator(T->lchild->data)) {
printf("(");
Algo_6_51(T->lchild);
printf(")");
@@ -53,8 +50,8 @@ void Algo_6_51(BiTree T) {
printf("%c", T->data);
if(T->rchild != NULL) {
// 当前结点的右孩子是操作符且优先级低于当前结点
if(IsOperator(T->rchild->data) && Priority(T->rchild->data, T->data) < 0) {
// 右子树是表达式,则添加括号
if(IsOperator(T->rchild->data)) {
printf("(");
Algo_6_51(T->rchild);
printf(")");
@@ -72,19 +69,3 @@ Status IsOperator(char c) {
return ERROR;
}
}
// 判断两个操作符的优先级
Status Priority(char a, char b) {
// a的优先级低
if((a == '+' || a == '-') && (b == '*' || b == '/')) {
return -1;
// a的优先级高
} else if((a == '*' || a == '/') && (b == '+' || b == '-')) {
return 1;
// 优先级相同
} else {
return 0;
}
}

View File

@@ -1 +1 @@
ÏÈÐòÐòÁСú*/*+a^^b^^-c^^d^^e^^-g^^h^^
ÏÈÐòÐòÁСú*/-+a^^b^^-c^^d^^e^^-g^^h^^