中缀表达式转变成后缀表达式

来源:互联网 发布:淘宝网旅游鞋女 编辑:程序博客网 时间:2024/04/28 18:46

我们这里只针对加减乘除运算的表达式进行转变。中缀表达式就是正常的表达式,例如a+b*c+(d*e+f)*g。我们需要将它转变成后缀表达式,也就是符号在数字后面。
转变规则就是如果遇到数字,就输出数字,如果遇到符号,比较这个符号和栈中的符号优先级的高低,如果这个符号优先级高,就压入栈中,反之,现将栈顶符号输出,再进行比较,决定是否输出符号。如果遇到左括号,它的优先级最高,只有碰到右括号,才将左括号弹出,但不输出。
首先是栈的定义以及优先级函数的定义

#include <stdio.h>#include <stdlib.h>#define mincap 100struct stack_node{    char *Array;    int topofstack;    int capacity;};typedef struct stack_node *Stack;//pushvoid 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;    }}//Popvoid Pop(Stack S){    if(S->topofstack==-1)        printf("error,pop,the stack is empty\n");    else    {        S->topofstack=S->topofstack-1;    }}//topchar 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;}
0 0
原创粉丝点击