C语言中序表达式转后序表达式并计算

用C语言和栈,输入任意带括号的中序表达式
(后序表达式的概念:又称后缀表达式,不含括号的表达式,他的运算符写在前面,操作数写在后面,也没有算术优先级问题,又称“逆波兰式”

优点:计算机从左到右扫描,不需要考虑算术优先级问题)


#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define maxsize 100
struct Node{
    int size;//数据容量 
    char *first;//仅作为空时的标志,计算位数 
    char *end;
};
typedef struct Node *stack;
void Change(stack str,char *arry);
int main()
{
    stack str = (stack)malloc(sizeof(struct Node)); //堆栈初始化 
    str->size = maxsize;
    str->end = (char *)malloc(sizeof(char)*str->size);
    str->first = str->end;//同一位置
    
    char *arry;
    arry = (char*)malloc(sizeof(char)*str->size);
    scanf("%s",arry);
    Change(str,arry);
    return 0;  
} 
void Change(stack str,char *arry)
{
    int i = 0;
    char ch;
    while( arry[i] != '\0')
    {
        while( isdigit(arry[i]) ) //输出数字 
        {
            printf("%c",arry[i++]);
            if( !isdigit(arry[i]) )//下一个字母不是数字,则退出 
            {
                printf(" ");
            }
        }
        if(arry[i] == '+' || arry[i] == '-')
        {
            if( str->end - str->first == 0)//堆栈为空的时候 
            {
                 *str->end++ = arry[i];
            }
            else//否则 
            {
                do{
                        if( *--str->end == '(' )//达到跳出的条件 
                        {
                            *str->end++ = '(';
                            break;
                        }
                        else
                            printf("%c ",*str->end);
                }while( str->end - str->first != 0 );
                *str->end++ = arry[i];
            } 
        }
        else if(arry[i] == ')')
        {
            ch = *--str->end;
            while(ch != '(')
            {
                printf("%c ",ch);  
                ch = *--str->end;
            }
        }
        else if(arry[i] == '*'|| arry[i] == '/' || arry[i] == '(')
        {
            *str->end++ = arry[i];   
        } 
        else
        {
          if(arry[i] == '\0')
              break;
          printf("\n输入格式错误!\n");
            return ;
        }
        i ++;     
    }
    while(str->end - str->first != 0)
    {
        printf("%c ",*--str->end);
    }
    return ;    
}