这里写个中缀转后缀的程序
看来网上的一些程序
大多数都是同一个程序 转来 转去的
而且我感觉写的不是很好
这里我自己写了个
当然这个程序也同样不包括检测部分
也就是说 假设输入是一个正确的中缀表达式
这里先给出主要的想法
依次从键盘输入表达式中的字符ch,对于每一个ch:
(1)若ch为数字,将后续的所有数字均依次存入数组exp中,并以字符“ ”标志数值串结束。
(2)若ch为左括弧“(”,则将此括弧入栈op。
(3)若ch为右括弧“)”,则将栈op中左括弧“(”以前的字符依次删除并存入数组exp中,然后将左括弧“(”删除。
(4)若ch为“+”或“-”,则将当前栈op中“(”以前的所有字符(运算符)依次删除并存入数组exp中,然后将ch入栈op中。
(5)若ch为“*”或“/”,则将当前栈op中的栈顶端连续的“*”或“/”删除并依次存入数组exp中,然后将ch入栈op中。
(6)若字符串str扫描完毕,则将栈op中的所有运算符依次删除并存入数组exp中,然后再将ch存入数组exp中,最后可得到表达式的后缀表示在数组exp中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
char stock[MAX];
int top=-1;

void fun( char a[],char b[])

...{
int i,len,j;
len=strlen(a);
j=-1;
for(i=0;i<len;i++)

...{
switch(a[i])

...{
case '(':stock[++top]='(';break;
case '-':
case '+':while(top>=0&&stock[top]!='(')
b[++j]=stock[top--];
stock[++top]=' ';
stock[++top]=a[i];
break;
case '*':
case '/':while(top>=0&&stock[top]!='('&&stock[top]!='+'&&stock[top]!='-')
b[++j]=stock[top--];
stock[++top]=' ';
stock[++top]=a[i];
break;
case')':while(stock[top]!='(')
b[++j]=stock[top--];
top--;
break;
default:
b[++j]=a[i];
if(i==len-1)

...{
b[++j]=' ';
break;
}
else
if(a[i+1]<='0'||a[i+1]>='9')

...{
b[++j]=' ';
}
}
}
while(top>=0)
b[++j]=stock[top--];
b[++j]='/0';
for(i=0;i<=j;i++)
printf("%c",b[i]);
}
int compvalue(char exp[])

...{
int i,len,sum=0,c;
top=-1;
int digit[MAX];
len=strlen(exp);

for(i=0;i<len;i++)

...{
switch( exp[i] )

...{
case' ': break;
case'+': sum=digit[top]+digit[top-1];
digit[--top]=sum;
break;
case'-':sum=digit[top-1]-digit[top];
digit[--top]=sum;
break;
case'*':sum=digit[top]*digit[top-1];
digit[--top]=sum;
break;
case'/':sum=digit[top-1]/digit[top];
digit[--top]=sum;
break;
default:
c=0;
while(exp[i]>='0'&&exp[i]<='9')

...{
c=c*10+exp[i]-48;
i++;
}
digit[++top]=c;
}
}
return digit[0];
}
int main()

...{
char a[MAX],b[MAX];
scanf("%s",a);
fun(a,b);
printf(" ");
printf("%d ",compvalue(b));


return 0;
}