中缀到后缀表达式的转换

#include  < iostream >
#include 
< stack >
#include 
< string >

using namespace std;

//移除空格
string RemoveSpace( const  string str);

//符号
// -1--Error,
// -2--Done, 
// 0--Pop to postfix, 
// 1--Push
int  op[ 5 ][ 4 =   {                /*    (      +,-  *,/   空     */
                    
/*     )    */    0,      0,    0,    -1},
                    
/*     (    */    1,      1,    1,   1},
                    
/*   +,-    */    1,      0,    0,   1},
                    
/*   *,/    */    1,      1,    0,     1},
                    
/*    空  */    {-1,      0,    0,  -2}
}
;
int  GetIndex( char  topStack); 
int  Compare( char  ch,  char  topStack);

//验证字符是否是合法字符
// false--字符非合法
bool Parse( const   char   &  ch);
//从中缀到后缀表达式的转换
string Convert( const  string  &  str);

// ---------------
int  main( int  argv,  char   *  args)
{
    string str 
= "x - (y*a/b - (z + d * e) + c ) / f";
    cout 
<< Convert(str) << endl;
    cout 
<< Convert("a + c - h / b * r"<< endl;
    
return 0;
}

// ----------------

//移除空格
string RemoveSpace( const  string str)
{
    string strTemp;
    
int len = str.size();
    
for(int i = 0; i < len; i++){
        
if(str[i] != ' ')
            strTemp 
+= str[i];
    }

    
return strTemp;
}
 

//符号表
// -1--Error,
// -2--Done, 
// 0--Pop to postfix, 
// 1--Push
/*-------------------------------------
               (       +,-      *,/     空        
    )          0,     0,        0,    -1        
    (          1,     1,        1,     1
  +,-        1,     0,        0,      1
  *,/         1,     1,        0,      1
  空       -1,     0,        0,     -2
--------------------------------------
*/


// called by Compare
int  GetIndex( char  topStack)
{
    
switch(topStack){
    
case '(':
        
return 0;
    
case '+':
    
case '-':
        
return 1;
    
case '*':
    
case '/':
        
return 2;
    
default:
        
return 3;
    }

}

int  Compare( char  ch,  char  topStack)
{
    
int index = GetIndex(topStack);

    
switch(ch){
    
case ')':
        
//cout << ")" << endl;
        return op[0][index];
        
break;
    
case '(':
        
//cout << "(" << endl;
        return op[1][index]; 
        
break;
    
case '+':
    
case '-':
        
//cout << "+,-" << endl;
        return op[2][index];
        
break;
    
case '*':
    
case '/':
        
//cout << "*,/" << endl;
        return op[3][index];
        
break;
    
default:
        
return op[4][index];
        
break;
    }
;
}



//验证字符是否是合法字符
//false--字符非合法

bool Parse( const   char   &  ch) {
    
if(ch == '+' || ch == '-' || ch == '*' || ch == '/' ||
        ch 
== '(' || ch == ')')
    
{
        
return true;
    }

    
else{
        
if(ch >= 'a' && ch <= 'z'){
            
return true;
        }

        
return false;
    }

}

//从中缀到后缀表达式的转换
string Convert( const  string  &  str)
{
    string result 
= "";
    string temp 
= RemoveSpace(str);
    stack
<char> operatorStack;

    
if(temp[0< 'a' || temp[0> 'z'){
        
return "string must begin with a char.";
    }

    
    
for(int i=0; i<temp.length(); i++){
        
char ch = temp[i];
        
if(Parse(ch))//如果解析正确
            if(ch >= 'a' && ch <= 'z'){
                result 
+= temp[i];
                
continue;
            }

            
else//ch =  +, -, *, /, (, )
                if(operatorStack.empty()){
                    operatorStack.push(ch);
                    
continue;
                }

                
char topStack = operatorStack.top();
                
int n = Compare(ch, topStack);
                
                
switch(n){
                
case 1://push
                    operatorStack.push(ch);
                    
continue;
                
case 0://pop
                    if(topStack != '(')//如果栈顶字符是'(', 则直接出栈
                        result += topStack;
                        i
--;
                    }
    
                    operatorStack.pop();
                    
continue;
                
default:
                    
return "convert wrong!";
                }
//end switch
            }
//end else
        }

    }
//end for
    while(!operatorStack.empty()){
        
char topStack = operatorStack.top();
        result 
+= topStack;
        operatorStack.pop();
    }

    
return result;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值