我们这里只针对加减乘除运算的表达式进行转变。中缀表达式就是正常的表达式,例如a+b*c+(d*e+f)*g。我们需要将它转变成后缀表达式,也就是符号在数字后面。
转变规则就是如果遇到数字,就输出数字,如果遇到符号,比较这个符号和栈中的符号优先级的高低,如果这个符号优先级高,就压入栈中,反之,现将栈顶符号输出,再进行比较,决定是否输出符号。如果遇到左括号,它的优先级最高,只有碰到右括号,才将左括号弹出,但不输出。
首先是栈的定义以及优先级函数的定义
#include <stdio.h>
#include <stdlib.h>
#define mincap 100
struct stack_node
{
char *Array;
int topofstack;
int capacity;
};
typedef struct stack_node *Stack;
//push
void Push(Stack S,char c)
{
if(S->topofstack+1==S->capacity)
printf("error ,the stack is full\n");
else
{
S->Array[S->topofstack+1]=c;
S->topofstack=S->topofstack+1;
}
}
//Pop
void Pop(Stack S)
{
if(S->topofstack==-1)
printf("error,pop,the stack is empty\n");
else
{
S->topofstack=S->topofstack-1;
}
}
//top
char Top(Stack S)
{
if(S->topofstack==-1)
printf("error,top,the stack is empty\n");
else
{
return S->Array[S->topofstack];
}
}
Stack Create(int Cap)
{
if(Cap>mincap)
{
Stack S=malloc(sizeof(struct stack_node));
S->capacity=Cap;
S->topofstack=-1;
S->Array=malloc(sizeof(char)*Cap);
printf("create success\n");
return(S);
}
else
printf("error ,cap is too small\n");
}
int Priority(char c)
{
switch(c)
{
case '+': return(1);break;
case '-': return(1);break;
case '*': return(2);break;
case '/': return(2);break;
case '(': return(3);break;
}
}
然后是主程序
int main()
{
Stack S=Create(200);
char *infix="(a-b)*c+(d*e+f)*g";
int i=0;
int tem_infix;
int tem_stack;
char tem_char;
for(;infix[i]!='\0';i++)
{
if(infix[i]!='+'&&infix[i]!='-'&&infix[i]!='*'&&infix[i]!='/'&&infix[i]!=')'&&infix[i]!='(')
printf("%c",infix[i]);
else
{
if(infix[i]!=')')
{
if(S->topofstack==-1)
Push(S,infix[i]);
else
{
tem_infix=Priority(infix[i]);
tem_stack=Priority(Top(S));
while(tem_infix<=tem_stack)
{
if(Top(S)=='(')
break;
else
{
printf("%c",Top(S));
Pop(S);
}
if(S->topofstack!=-1)
tem_stack=Priority(Top(S));
else
break;
}
Push(S,infix[i]);
}
}
if(infix[i]==')')
{
while(Top(S)!='('&&S->topofstack!=-1)
{
printf("%c",Top(S));
Pop(S);
}
if(Top(S)=='(')
Pop(S);
}
}
}
while(S->topofstack!=-1)
{
printf("%c",Top(S));
Pop(S);
}
return 0;
}