中缀表达式变为后缀表达式,栈实现

#include <stdio.h>
#define MaxSize 50

typedef struct{
    char data[MaxSize];
    int top;
}SqStack;


void InitStack(SqStack &S){
    S.top = -1;    
}
int StackEmpty(SqStack &S){
    if(S.top == -1)
        return 1;
    else
        return 0;
}
void Push(SqStack &S,char x){
    if(S.top==MaxSize -1)
        return ;
    S.data[++S.top] = x;
}
void Pop(SqStack &S,char &x){
    if(S.top== -1)
        return;
    x = S.data[S.top--];
    
}
void GetTop(SqStack &S,char &x){
    if(S.top== -1)
        return ;
    x = S.data[S.top];
}
/*
    逆序 输出 
*/
void InverseStack(SqStack &S,SqStack &S1){
    char x;    
    while(S.top > -1){
        Pop(S,x);
        Push(S1,x);
    }
    while(!StackEmpty(S1)){
        Pop(S1,x);
        printf("%c",x);
    }

}

/*
    括号匹配  
*/
int Bracket_Match(char t[],int length){
    
    SqStack S;        
    InitStack(S);
    int i=0;
    while(i<length){
        char x ;
        if(t[i]=='(' || t[i]=='[' || t[i]=='{'){
            Push(S,t[i++]);
        }else {
            Pop(S,x);
            if(t[i] == ')' && x == '('){
                i++;
            }
            else if(t[i] == ']' && x =='['){
                i++;
            }
            else if(t[i] == '}' && x =='{'){
                i++;    
            }else{
                return 0;
            }    
        }
    }
    
    return 1;
}
/*
    中缀转为后缀 
*/
int isNum(char x){
    if(x<='9' && x>='0'){
        return 1;
    }else{
        return 0;
    }
}
int notPirio(char x,char exp){
    if((exp == '*' || exp == '/') && (x == '*' || x == '/')){
        return 1;
    }else if((exp == '+' || exp =='-') && (x == '+' || x=='-')){
        return 1;
    }else if((exp == '+' || exp =='-') && (x == '*' || x == '/')){
        return 1;
    }else {
        return 0;
    }
}
void Postfix_exp(char exp[]){
    SqStack s1,s2;
    InitStack(s1);
    InitStack(s2);
    int i = 0;
    int count =0;
    char x;
    while(exp[i] != '\0'){
        if(isNum(exp[i])){
            Push(s1,exp[i]);
            i++;
        }else if(exp[i] == '('){
            Push(s2,exp[i]);
            i++;
        }else if(exp[i] == ')'){
            Pop(s2,x);
            while(x != '('){
                Push(s1,x);    
                Pop(s2,x);    
            }
            i++;
        }else{
            if(StackEmpty(s2)){
                Push(s2,exp[i++]);
            }
            else{
                GetTop(s2,x);
                while(notPirio(x,exp[i]) && !StackEmpty(s2)){
                    Pop(s2,x);
                    Push(s1,x);
                    GetTop(s2,x);
                }
                Push(s2,exp[i]);
                i++;
            } 
            
        }
    }
    while(!StackEmpty(s2)){
        Pop(s2,x);
        Push(s1,x);
    }
    InverseStack(s1,s2);
    
}
int main(){
    
    char tt[30]={
        '2','/','1','+','2','*','8','*','(','4','-','5',')','\0'
    };
    char t[30]={
        '1','*','(','2','+','3',')','\0'
    };
    Postfix_exp(tt);
    return 0;
}

 

posted @ 2017-08-05 21:50  式微胡不归  阅读(290)  评论(0编辑  收藏  举报