3-1 表达式转换(25 分)

3-1 表达式转换(25 分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

 
   

2 3 7 4 - * + 8 4 / +

 
序号输入输出
1
2+3*(7-4)+8/4
2 3 7 4 - * + 8 4 / +
2
((2+3)*4-(8+2))/5
2 3 + 4 * 8 2 + - 5 /
3
1314+25.5*12
1314 25.5 12 * +
4
-2*(+3)
-2 3 *
5
123
123

/*代码未完善,bug一大堆,千万不要乱测试 凉的会是你*/ #include<stdio.h>
int judgePoitive(char *snap , int i);
int judgePriority(char *snap, int i, char sorting);
int judgePoitive(char *snap,int i)//+或-号前一位字符
{//1代表为正负号-1为运算字符
if (i == 0 || (*(snap + i - 1) == '+' || *(snap + i - 1) == '-' || *(snap + i - 1) == '*' || *(snap + i - 1) == '/' || *(snap + i - 1) == '(' ))
return 1;
else
return -1;
}
int judgePriority(char *snap,int i,char sorting)
{
int judge = 0;


if (*(snap+i) == '+' || *(snap+i) == '-')
{
judge = judgePoitive(snap , i);
if (judge == 1)
return judge;
else if (judge == -1)
{
if (sorting == '\0'||sorting=='(')
{
return 4;
}
else if (*(snap + i) == sorting )//同符号,出栈
return -1;
else if (*(snap + i) == '+' || *(snap + i) == '-')//同等级,回2,栈顶等级高回3相反回4
{//同等级查找
if (sorting == '+' || sorting == '-')
return 2;
else if (sorting == '*' || sorting == '/')
return 3;
else
return 4;
}
else if (*(snap + i) == '*' || *(snap + i) == '/')
{
if (sorting == '+' || sorting == '-' || sorting == '(')
return 4;
else 
return 2;
}
}
}
else
return 317;
}
int main(void)
{
char snap[42] = { '\0' };
char strack[21] = { '\0' };
scanf("%s", snap);


int i = 0, j = 0; int k = 0; int n = 317;
for (i = 0; snap[i] != '\0'; i++)//
{
if ((snap[i] >= '0'&&snap[i] <= '9'))
{
//数字,输出
while (1)
{
if ((snap[i] < '0' || snap[i] > '9'))
{
n = 666;
i--;
break;
}
if (n == 1)
{
printf("%c", snap[i]);
}
/* else if (i > 1 && snap[i - 2] == '('&&snap[i - 1] == '+')
printf(" %c", snap[i]);*/
else if (i > 0 && (snap[i - 1] == '+' || snap[i - 1] == '-' || snap[i - 1] == '*' || snap[i - 1] == '/' || (snap[i - 1] == '('&&snap[i - 2] != '(')))
printf(" %c", snap[i]);
else
printf("%c", snap[i]);
i++;
}
}
else if (snap[i] == '.')//当字符为小数点时,进行输出至下一个符号前
{
while (1)
{
printf("%c", snap[i]);
i++;
if (snap[i]<'0' || snap[i]>'9')
{
i--;
break;
}
}
}
else if (snap[i] == '(')
{
//左括号,压栈
if (j == 0&&strack[j]=='\0')
{
strack[j] = snap[i];
}
else
{
j++;
strack[j] = snap[i];
}
}
else if (snap[i] == ')')
{
//右括号,出栈至左括号,赋空
while (strack[j] != '(')
{
printf(" %c", strack[j]);
j--;
}
strack[j--] = '\0';

}
else//其他字符
{
n = judgePriority(snap, i, strack[j]);
if (n == 1)
{
if (snap[i] == '+')//正号不输出,需要省略
{
n = 666;
continue;
}
if(i==0)
printf("%c", snap[i]);
else
printf(" %c", snap[i]);
}
else if (n == -1)//输出至数组
{
printf(" %c", snap[i]);
}
else if (n == 2)
{
printf(" %c", strack[j]);
strack[j] = snap[i];
}
else if (n == 3)
{
printf(" %c", strack[j]);
strack[j--] = '\0';
i--;
}
else if (n == 4)
{
if (j == 0&&strack[j]=='\0')
{
strack[j] = snap[i];
}
else
{
j++;
strack[j] = snap[i];

}
else if (n == 317)
{
if (j == 0 && strack[j] == '\0')
{
strack[j] = snap[i];
}
else
{
j++;
strack[j] = snap[i];
}


}
}
}
while (strack[0]!='\0'&&j>=0)//当栈中还有符号时,进行输出
{
printf(" %c", strack[j]);
j--;
}


return 0;
}
看不懂的可以留言 看到即尽力回答
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matthew_leung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值