中缀表达式:操作符在两个操作数中间
后缀表达式:操作符在两个操作数后面
例:” 9+(3-1)×3+10÷2 “ 20
“ 9 3 1 - 3 * + 10 2 / + ” 逆波兰表达式
规则:(1)如果是数字,则直接输出
(2)如果是左括号直接入栈
(3)如果是右括号,出栈,直到遇到第一个左括号
(4)如果是 * 或者 / ,出栈,直到栈空或者左括号遇到 + - ,当前符号入栈
(5)如果是 + 或者 - ,出栈,直到栈空或者左括号,当前符号入栈。
如果中缀表达式走完,将栈中的内容全部弹出。
void Resver(char *src);
{
if(src == NULL) return;
Stack st;
InitStack(*st);
char *p = src;
while(*p )
{
if(isdigit(*p))
{
printf("%c",*p);
p++;
continue;
}
printf(" ");
if(*p == ' ( ')
{
Push(&st,*p);
}
else if(*p == ' ) ')
{
char c = 0;
while(1)
{
Top(&st , &c);
Pop(&st);
if(c == ' ( ')
{
break;
}
printf("%c",c);
}
}
else if(*p == ' * ' || *p == ' / ')
{
char c = 0;
while( !Empty(&st))
{
Top(&st , &c);
if(c == ' + ' || c == ' - ' || c == ' ( ')
{
break;
}
Pop(&st);
printf("%c",c);
}
Push(&st , *p);
}
else if(*p == '+' || *p == '-')
{
char = 0;
while(!Empty(&st))
{
Top(&st,&c)
if(c ==' ( ')
{
break;
}
Pop(&st);
printf("%c",c);
}
Push(&st,*p)
}
p++;
}
while(!Empty(&st))
{
char c = 0;
Top(&st,&c);
Pop(&st);
printf("%c",c);
}
printf("\n");
}