第6週目プロジェクト5-接尾辞式

3727 ワード

問題とコード
/*  
*Copyright (c) 2015,           
*All rights reserved.  
*    :test.cpp  
*  :   
*    :2015 10 12   
*   :v1.0  
*  
*    :  sqstack.h       ,                        
。  ,  (56-20)/(4+2),       ::56#20#-4#2#+/       #。
*    :  
*    :  
*/   

#include <stdio.h>
#include <stdlib.h>
//#include "sqstack.h"
#define MaxOp 7


struct  //        
{
    char ch;   //   
    int pri;   //   
}
lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};

int leftpri(char op)    //     op    
{
    int i;
    for (i=0; i<MaxOp; i++)
        if (lpri[i].ch==op)
            return lpri[i].pri;a
}

int rightpri(char op)  //     op    
{
    int i;
    for (i=0; i<MaxOp; i++)
        if (rpri[i].ch==op)
            return rpri[i].pri;
}

bool InOp(char ch)       //  ch      
{
    if (ch=='(' || ch==')' || ch=='+' || ch=='-'
            || ch=='*' || ch=='/')
        return true;
    else
        return false;
}

int Precede(char op1,char op2)  //op1 op2           
{
    if (leftpri(op1)==rightpri(op2))
        return 0;
    else if (leftpri(op1)<rightpri(op2))
        return -1;
    else
        return 1;
}
void trans(char *exp,char postexp[])
//      exp        postexp
{
    SqStack *opstack;               //      
    int i=0;                //i  postexp   
    ElemType ch;
    InitStack(opstack);   //             ,    
    Push(opstack, '=');
    while (*exp!='\0')      //exp          
    {
        if (!InOp(*exp))        //        
        {
            while (*exp>='0' && *exp<='9') //     
            {
                postexp[i++]=*exp;
                exp++;
            }
            postexp[i++]='#';   // #         
        }
        else    //       
        {
            GetTop(opstack, ch);   //        
            switch(Precede(ch ,*exp))
            {
            case -1:           //          :  
                Push(opstack, *exp);
                exp++;     //        
                break;
            case 0:        //          
                Pop(opstack, ch);      // (  
                exp++;     //        
                break;
            case 1:             //      postexp 
                postexp[i++]=ch;
                Pop(opstack, ch);
                break;
            }
        }

    } //while (*exp!='\0')
    Pop(opstack, ch);
    while (ch!='=')
        //  exp    ,   '='  
    {
        postexp[i++]=ch;
        Pop(opstack, ch);
    }
    postexp[i]='\0';    // postexp         
    DestroyStack(opstack);
}

int main()
{
    char exp[]="(56-20)/(4+2)"; //  exp      
    char postexp[200];
    trans(exp,postexp);
    printf("     :%s
",exp); printf(" :%s
",postexp); return 0; }

実行結果