mirror of
https://github.com/kangjianwei/Data-Structure.git
synced 2026-02-06 08:21:44 +08:00
🐛 (#18)修复习题6.51在父操作符与右孩子操作符优先级相同时不会添加括号的BUG
This commit is contained in:
@@ -1 +1 @@
|
||||
ÏÈÐòÐòÁСú*/*+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
ÏÈÐòÐòÁСú*/-+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
先序序列→*/*+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
先序序列→*/-+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
ÏÈÐòÐòÁСú*/*+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
ÏÈÐòÐòÁСú*/-+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
ÏÈÐòÐòÁСú*/*+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
ÏÈÐòÐòÁСú*/-+a^^b^^-c^^d^^e^^-g^^h^^
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user