/*
1.首先先将中缀表达式转换为后缀表达式
2.然后我们要分情况;
如果为数字字符串就直接入栈;
如果是左括号入栈就直接入栈
如果是右括号则将栈中左括号之前的所有字符出栈;
如果是数字字符串则需要考虑运算符的优先级
最后将栈最后一个赋为0,字符串结束
*/
/************************************/
#include<stdio.h>
#include<stdlib.h>
#define newp (stype *)malloc(sizeof(stype)) //定义一个申请栈地址的宏
typedef struct _stack{
char dat;
struct _stack *next;
} stype; //建立栈类型
int tance(char x) //探测优先级
{
if(x=='+'||x=='-') return 0;
else if (x=='*'||x=='/') return 1;
else if (x=='@'||x=='('||x==')') return -1;
}
int main()
{
stype *s,*top; //栈指针和栈顶指针
char c;
s=newp;
s->dat='@';
s->next=NULL;
top=s;
printf("please input : ") ;
c=getchar(); //此后为读取中缀表达式的部分,用字符一个一个的读,直到读到回车
printf("It's output : ");
while(c!='\n')
{
if (c>='0'&&c<='9') //如果读入数字,直接打印
{
printf("%c ",c);
}
else if (c=='(') //如果是左括号,直接进栈
{
s=newp;
s->dat=c;
s->next=top;
top=s;
}
else if (c==')') //如果是右括号,匹配左括号,把两者之间的栈内符号全部弹出
{
while (top->dat!='(')
{
s=top;
printf("%c ",top->dat);
top=top->next;
free(s);
}
s=top;
top=top->next;
free(s);
}
else //否则肯定是+-*/了
{
int a=tance(c);
int b=tance(top->dat); //比较该符号和栈顶符号的优先级
if (a>b) //如果大于直接压进去
{
s=newp;
s->dat=c;
s->next=top;
top=s;
}
else //否则就把栈顶的符号一直弹出,直到弹到可以压进去,然后压进去(也就是说等于也不能压进去)
{
while (a<=b)
{
s=top;
printf("%c ",top->dat);
top=top->next;
free(s);
b=tance(top->dat);
}
s=newp;
s->dat=c;
s->next=top;
top=s;
}
}
c=getchar(); //读取下一个字符
}
while (top->dat!='@') //读完和还不算完,还要把栈内剩余的所有符号挨个弹出
{
s=top;
printf("%c ",top->dat);
top=top->next;
free(s);
}
return 0; //后缀表达式输出完毕
}