#define ip 1
#define ep 2
typedef struct Nodestack{
int next[100];
int top;
int x;
}Nodestack;
char Initstack(Nodestack* p)
{
p->top = 0;
}
char Push(Nodestack* p,char data)
{
p->next[p->top++] = data;
return 0;
}
char EmptyStack(Nodestack* p)
{
if (p->top == 0)return 1;
return 0;
}
char Pop(Nodestack* p)
{
char data = 0;
if (EmptyStack(p))return 1;
data = p->next[--p->top];
p->next[p->top] = 0;
return data;
}
char JudgeNumOrSig(char* p)//判断是数字还是运算符
{
if (*p>=48 && *p<=57 &&*p!='/0')//依据ascall码
{
return *p;
}
if(*p >= 42 && *p <= 47 && *p != '/0')return -1;
}
char Prior(Nodestack* s,char z) //运算符优先级判断
{
int pin = 0;//表示优先级,栈内优先级低于栈外,
int pex = 0;//表示优先级,栈外优先级低于栈内
if (s->next [(s->top)-1] == '+' || s->next[(s->top)-1] == '-')
{
if (z == '*' || z == '/')
{
pin = 1;//栈内优先级低于栈外
}
}
if (s->next[(s->top) - 1] == '*' || s->next[(s->top) - 1] == '/')
{
if (z == '+' || z == '-')
{
pex = 1;
}
}
if (pin == pex)return ip;//返回左侧
return pin < pex ? ip : ep;
}
int Cal(Nodestack* s,char* p,int x)
{
char a[100];
int j = 0;
int q = 0;
for(int i=0;i<x;i++)
{
if (JudgeNumOrSig(p + i) == -1)
{
if(EmptyStack(s))
{
Push(s, *(p + i));
}
else if (Prior(s,p[i])==ip)
{
while((Prior(s, p[i]) == ip)&& (EmptyStack(s)!=1))
{
a[j++] = Pop(s);
}
Push(s, *(p + i));
}
else if (Prior(s,p[i]) == ep)
{
Push(s, *(p + i));
}
}
if (JudgeNumOrSig(p + i) != -1)
{
a[j++] = *(p + i);
}
}
if (~(EmptyStack(s)))
{
q = s->top;
for (int i =1; i <= q;i++)
{
a[j++] = Pop(s);
}
}
a[j] = '\0';
printf("%s",a);
}
void main(void)
{
Nodestack s;
char p[100];
Initstack(&s);
scanf("%s", p);
int len = strlen(p);
Cal(&s, p, len);
}
有些细节没有处理,并不是很健壮的代码,基本实现中缀转后缀表达式,要是遇到什么问题欢迎指正。