算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int IsNumber(char a)
{
return a >= '0' && a <= '9' || a == '.'; //判断是否为数字
}
int IsSymbol(char a)
{
return a == '-' || a == '+';
}
int Compare(char a, char b) //比较栈顶与str1[i]的优先级
{
if (b == ')')
return 1; //若右括号,将栈顶运算符依次弹出,直到遇到左运算符
else if (a == '(' || b == '(') //若左括号,将其压栈
return 0;
switch (b)
{
case '+':
case '-':
return 1; //运算符优先级一定小于等于栈顶运算符,栈顶运算符弹出
case '*':
case '/':
switch (a)
{
case '*':
case '/':
return 1; //运算符优先级等于栈顶运算符,栈顶运算符弹出
case '+':
case '-':
return 0; //运算符优先级大于栈顶运算符,将其压栈
}
}
}
int main()
{
int i, j, k, l;
char input[21], symbol[21];
int flag = 0; //表示str2是否为空
int space = 0; //是否需要添加空格
scanf("%s", input);
l = strlen(input);
for (i = 0; i < l; i++)
{
if (IsNumber(input[i]))
{
if (space)
{
printf(" ");
space = 0;
}
printf("%c", input[i]);
}
//如果input[i]为‘+’或者‘-’,且前一个不是数字和右括号或者i是第一个元素且为符号时
else if (IsSymbol(input[i]) && (i ? !IsNumber(input[i - 1]) && input[i - 1] != ')' : 1))
{
if (input[i] == '-') //如果是负号的话
{
if (space)
{
printf(" ");
space = 0;
}
printf("%c", input[i]);
}
}
else
{
if (flag) //若符号栈有元素的话
{
if (input[i] == ')')
{
while (flag--)
{
if (symbol[flag] == '(')
break;
printf(" %c", symbol[flag]);
}
}
else
{
while (flag)
{
if (Compare(symbol[flag-1], input[i]))
{
printf(" %c", symbol[--flag]);
}
else
break;
}
symbol[flag++] = input[i];
}
}
else //若符号栈没有元素的话
{
symbol[flag++] = input[i];
}
for (j = 0; j < flag; j++)
{
if (symbol[j] != '(')
{
space = 1;
break;
}
}
}
}
while (flag)
{
printf(" %c", symbol[--flag]);
}
}
该程序实现了将中缀表达式转换为后缀表达式的功能。输入一个不超过20个字符的中缀表达式,程序会输出相应的后缀表达式。算法主要通过栈操作,遵循运算符的优先级规则,处理括号和各种运算符,确保转换的正确性。
3990

被折叠的 条评论
为什么被折叠?



