逆波兰式的实现(栈实现)

假设表达式由单字母变量和双目四则运算算符构成。试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。
Stack是一个已实现的栈。
可使用的相关类型和函数:
typedef char SElemType; // 栈Stack的元素类型
Status InitStack(Stack &s);
Status Push(Stack &s, SElemType e);
Status Pop(Stack &s, SElemType &e);
Status StackEmpty(Stack s);
SElemType Top(Stack s);

实现函数如下:

char *RPExpression(char *e)
/* 返回表达式e的逆波兰式 */
{    
     Stack s;
     int i,j = 0;
     SElemType p;
     char *c;
     c = (char*)malloc(sizeof(char) * strlen(e));
     InitStack(s);
     for(i = 0;e[i] != '\0';i++){
        if(e[i] >= 'a' && e[i] <= 'z')
            c[j++] = e[i];
        else{
            if(StackEmpty(s))//栈空,进栈
                Push(s,e[i]);
            else{
                switch(e[i]){
                    case '+' :;
                    case '-' :{
                        while(!StackEmpty(s) && Top(s) != '('){//栈不空且栈顶元素不为"("
                            Pop(s,p);
                            c[j++] = p;
                        }
                        Push(s,e[i]);
                    }
                    break;
                    case '*' :;
                    case '/' :{
                        while(!StackEmpty(s) && Top(s) != '(' && Top(s) != '+' && Top(s) != '-'){//栈不空且栈顶元素不为"(","+"和"-"
                            Pop(s,p);
                            c[j++] = p;
                        }                       
                        Push(s,e[i]);
                    }    
                    break;
                    case '(' : Push(s,e[i]);break;//遇到"(",则压栈
                    case ')' :{                   //遇到")"则弹栈
                        while(Top(s) != '('){     //将括号内的运算符依次弹出
                            Pop(s,p);
                            c[j++] = p;
                        }
                        Pop(s,p);
                        c[j] = p;
                    }
                    break;                    
                }                 
             }             
        }        
     }
     while(!StackEmpty(s)){ //栈未空,将栈低元素依次弹出
        Pop(s,p);
        c[j++] = p;
     }
     c[j] = '\0';
     return c;     
}


你可能感兴趣的:(数据结构)