中缀表达式转后缀表达式

 后缀表达式用于表达式计算很方便,所以写了段代码把中缀表达式转成后缀表达式。

这段代码只能一边转换一边输出,要想用还需要修改。

现在最重要的问题:不能正常处理右结合的操作符,如果有两个以上的右结合操作符连续,输出就不正确。解决方法已经想到了,明儿早上再说喽~

 

有错误欢迎指出,共同进步!

 

Code:
  1. //获得运算符的优先级  
  2. int getoppri(const char op)  
  3. {  
  4.     switch(op)  
  5.     {  
  6.         case '/0' :  
  7.             return 0;  
  8.         case '(' :  
  9.             return 1;  
  10.         case ')' :  
  11.             return 2;  
  12.         case '+' :  
  13.   
  14.         case '-' :  
  15.             return 3;  
  16.         case '*' :  
  17.   
  18.         case '/' :  
  19.   
  20.         case '%' :  
  21.             return 4;  
  22.         case '^' :  
  23.             return 5;  
  24.         default:  
  25.             return 0;  
  26.     }  
  27. }  
  28.   
  29. int main()  
  30. {  
  31.     char test[]="2+3*4^5*6+7";  
  32.     char* start=test;  
  33.     char* end=start+strlen(test);  
  34.     stack<char> opstack;  
  35.     opstack.push('/0');  
  36.   
  37.     while(start!=end){  
  38.         if(isdigit(*start)){  
  39.             cout<<*start;  
  40.         }else if(*start=='('){  
  41.             opstack.push(*start);  
  42.         }else if(*start==')'){  
  43.             while(opstack.top()!='('){  
  44.                 cout<<opstack.top();  
  45.                 opstack.pop();  
  46.             }  
  47.             opstack.pop();  
  48.         }else{  
  49.             while(getoppri(opstack.top())>=getoppri(*start)){  
  50.                 cout<<opstack.top();  
  51.                 opstack.pop();  
  52.             }  
  53.             opstack.push(*start);  
  54.         }  
  55.         start++;  
  56.     }  
  57.   
  58.     while(opstack.size()!=0){  
  59.         cout<<opstack.top();  
  60.         opstack.pop();  
  61.     }  
  62.   
  63.     cout<<endl;  
  64.   
  65.     int i;  
  66.     cin>>i;  
  67.      return 0;  
  68. }  

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值