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

我们这里只针对加减乘除运算的表达式进行转变。中缀表达式就是正常的表达式,例如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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值