中缀表达式转换为后缀表达式

看到数据结构,实现一个表达式树,需要将中缀表达式转换为后缀来处理,自己试着写了一下。应该问题不少。

  1. /********************************************************************
  2.     created:    2008/11/09
  3.     created:    9:11:2008   15:20
  4.     file base:  Main
  5.     file ext:   cpp
  6.     author:     Ai
  7.     
  8.     purpose:    中缀表达式转为后缀表达式
  9. *********************************************************************/
  10. #include <iostream>
  11. #include <vector>
  12. #include <stack>
  13. #include <algorithm>
  14. using namespace std;
  15. int Priority(char sign)//判断符号优先级
  16. {
  17.     switch(sign)
  18.     {
  19.     case '(':
  20.           return 0;
  21.     case '+':
  22.     case '-':
  23.           return 1;
  24.     case '*':
  25.     case '/':
  26.           return 2;
  27.     }
  28. }
  29. void InfixToPostfix(vector<char> &v,vector<char> &Output)//将中缀表达式转为后缀表达式
  30. {
  31.     stack<char> sign;
  32.     vector<char>::iterator iter = v.begin();
  33.     char temp;
  34.     while(iter != v.end())
  35.     {
  36.         switch(*iter)
  37.         {
  38.         case '0':
  39.         case '1':
  40.         case '2':
  41.         case '3':
  42.         case '4':
  43.         case '5':
  44.         case '6':
  45.         case '7':
  46.         case '8':
  47.         case '9':
  48.             Output.push_back(*iter);//数字直接放入输出序列中
  49.             break;
  50.         case '(':
  51.             sign.push(*iter);//左括号直接放入栈中
  52.             break;
  53.         case ')'://遇到右括号时把栈中左括号之前的符号全部放到输出序列中,并删除左括号
  54.             {
  55.                 do 
  56.                 {
  57.                     temp = sign.top();
  58.                     Output.push_back(temp);
  59.                     sign.pop();
  60.                 } while (sign.top() != '(');
  61.                 sign.pop();
  62.                 break;
  63.             }
  64.         default://处理+、-、*、/符号
  65.             {
  66.                 if(sign.empty())//如果栈为空,直接压栈
  67.                 {
  68.                     sign.push(*iter);
  69.                     break;
  70.                 }
  71.                 else//否则先把比当前符号优先级大的符号全部放入输出序列,在把该符号压栈
  72.                 {
  73.                     while(!sign.empty()&&Priority(*iter) <= Priority(sign.top()))
  74.                     {
  75.                         Output.push_back(sign.top());
  76.                         sign.pop();
  77.                     }
  78.                     sign.push(*iter);
  79.                     break;
  80.                 }
  81.             }
  82.         }
  83.         iter++;
  84.     }
  85.     while(!sign.empty())//把栈中符号全部放入输出序列
  86.     {
  87.         Output.push_back(sign.top());
  88.         sign.pop();
  89.     }
  90. }
  91. int main()
  92. {
  93.     vector<char> v,Output;
  94.     char temp;
  95.     while(cin>>temp&&temp != '#')//输入一个表达式以#结尾,比如:1+2*3+(4*5+6)*7#
  96.         v.push_back(temp); 
  97.     InfixToPostfix(v,Output);
  98.     copy(Output.begin(),Output.end(),ostream_iterator<char>(cout));//输出
  99.     return 0;
  100. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值