#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void Print()//若需要空格则输出
{
static int flag = 0;//static变量存储在静态存储区,只进行一次初始化。
if (flag)putchar(' ');
flag = 1;
}
int main()
{
char str[31];//输入字符串
char stack[31];//储存运算符号的栈
int top = -1;//top为-1表示栈为空
int len;
int i;
gets(str);
len = strlen(str);
for (i = 0; i < len; i++)
{
if ((str[i] == '+' || str[i] == '-') && (i == 0 || i > 0 && str[i - 1] == '(') || isdigit(str[i]))
{
//(i > 0 && str[i - 1] == '(')当i==0时会马上返回0,而不会因访问str[i-1]而导致越界。
//数字或正负号直接输出(正负号只能出现在开头或中间的'('之后)。
Print();
if (str[i] != '+')putchar(str[i]);//正号虽意味着之后的字符直接输出但正号本身不输出
while (i + 1 < len && (str[i + 1] == '.' || isdigit(str[i + 1])))putchar(str[++i]);
}
else//处理运算符
{
if (str[i] == ')')//遇到右括号则将左括号前所有运算符全部输出
{
while (stack[top] != '(')
{
Print();
putchar(stack[top--]);
}
top--;//如果栈不空,跳过左括号
}
else//如果栈不空,跳过左括号
{
if (top == -1)
{
stack[++top] = str[i];
continue;
}
while (top > -1 && stack[top] != '(')//栈顶操作符低于当前操作符则进栈,否则不断出栈
{
if (str[i] == '(' || (str[i] == '*' || str[i] == '/') && (stack[top] == '+' || stack[top] == '-'))
break;
Print();
putchar(stack[top--]);
}
stack[++top] = str[i];//当前操作符入栈
}
}
}
while (top > -1)//已处理完毕,输出栈中剩余操作符
{
Print();
putchar(stack[top--]);//除左括号外依次输出
}
return 0;
}
07-22
1999
03-30
2167