中缀转后缀表达式

对于一个中缀表达式 a+b*c*(d-e/f) 转换成后缀是这样的形式 abc*def/-+
 后缀表达式是相当有用处的,转换成后缀表达式后求值会简单很多.那么该如何转换呢?

网上关于这方面的资料一搜一大把,每本数据结构的书中都会提及这个算法,在这个算法中,用到 栈 这个数据结构.

1,关键是比较运算符的优先级,谁的优先级高,谁就出现在前面上面的表达式中,有括号的时候括号优先级最高,*/次之,+-最后. 在上面的表达式中+的优先级不如*的高,因此,在后缀表达式中*出现在+前面,

2,遇到操作数的时候总是直接输出,不做任何比较

3,遇到左括号总是直接入栈,遇到右括号的时候总是弹栈,一直弹到遇到一个左括号

4,遇到操作符的时候就先将这个操作符和它前面的操作符比较优先级,假如高于前面的优先级,先将它压栈,假如低于或等于前面的操作符的优先级,就把前面的优先级比它高的或相等的顺序弹出来, 一直弹到遇到优先级比它还低的或者到了栈顶

好了就是上面的几种情况,然后就可以写代码了....

先规定一些优先级

  1. enum{FLAG = -1,
  2.             L_BRCAKET = 0,
  3.             PLUS = 1,MINUS = 1,
  4.             MULTIPLY = 2, DIVISON = 2}; // FLAG为栈顶标志,优先级最低

分别为左括号,加减乘除的优先级定义,这儿有一个 FLAG = -1.是做什么咧?

        假如分析上面的4点就会发现,有一些特例,比如第一个操作符入栈之前要跟前面的操作符比较优先级,但是前面还没有操作符,就只好当做一个特例特别处理,先判断是否栈为空,然后操作, 假如我们先将 一个标志符号压入栈,并让它的优先级低于其他所有的操作符的优先级,这样它就永远不会被弹出, 而且消除了特例的判断,这是技巧

        另外注意,把左括号的优先级定义的很低,这也是有道理的.因为我们总是当遇到右括号的时候才把左括号弹出来..

  1. stack<char> opt;
  2.     opt.push('#');
  3.     int len = infix.length();
  4.     for (int i = 0; i < len; i++)
  5.     {
  6.         char ch = infix.at(i);
  7.         if (isalnum(ch))// 数字直接输出
  8.         {
  9.             cout<<ch;
  10.         }
  11.         else  // 操作符就判断并压栈
  12.         {
  13.             if (ch == '('// 左括号直接压栈
  14.                 opt.push(ch);
  15.             else if (ch == ')'// 有括号就弹栈到直到遇到左括号
  16.             {
  17.                 ch = opt.top();  // 取得栈顶操作符
  18.                 while(ch != '('// 直到弹出左括号
  19.                 {
  20.                     cout<<ch;
  21.                     opt.pop();
  22.                     ch = opt.top();
  23.                 }
  24.                 opt.pop(); // 弹出左括号
  25.             }
  26.             else
  27.             {
  28.                 int thisPri = GetPri(ch); // 当前操作符优先级
  29.                 char prevOpt = opt.top(); // 上一个操作符
  30.                 int prevPri = GetPri(prevOpt); // 上一个操作符优先级
  31.                 while (thisPri <= prevPri) 
  32.                 {   //输出栈中的操作符直到遇到比当前的操作符优先级更低的
  33.                     cout<<prevOpt;
  34.                     opt.pop(); // 输出后就弹出
  35.                     prevOpt = opt.top();
  36.                     prevPri = GetPri(prevOpt);
  37.                 }
  38.                 opt.push(ch);  //当前操作符压栈
  39.             }
  40.         }
  41.     }
  42.     char ch = opt.top(); // 表达式扫描完后把栈中剩余的操作符全部输出
  43.     while (ch != '#')
  44.     {
  45.         cout<<ch;
  46.         opt.pop();
  47.         ch = opt.top();
  48.     }
  49.     cout<<endl;

最后广告,编程群 c,c++,mfc,java 欢迎加入 58698324

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中缀后缀表达式是一种将数学表达式从中缀形式换为后缀形式的方法。下面我以一个简单的数学表达式"c"为例来说明中缀后缀的过程。 在中缀后缀的过程中,我们需要使用一个栈来辅助操作。具体的步骤如下: 1. 创建一个空栈和一个空字符串,分别用来存储运算符和后缀表达式。 2. 从左到右遍历中缀表达式。对于每个元素,进行如下操作: - 如果当前元素是操作数(即字母或数字),则直接将其添加到后缀表达式中。 - 如果当前元素是运算符,则进行如下操作: - 如果栈为空,或栈顶元素为左括号"(",则将当前运算符入栈。 - 如果当前运算符的优先级大于栈顶运算符的优先级,则将当前运算符入栈。 - 如果当前运算符的优先级小于或等于栈顶运算符的优先级,则将栈顶运算符出栈,并添加到后缀表达式中。重复此步骤,直到当前运算符的优先级大于栈顶运算符的优先级为止。最后,将当前运算符入栈。 - 如果当前元素是左括号"(",则将其入栈。 - 如果当前元素是右括号")",则将栈中的元素出栈,并添加到后缀表达式中,直到遇到左括号"("为止。此时,将左括号出栈。 3. 当中缀表达式遍历完毕后,将栈中剩余的运算符依次出栈,并添加到后缀表达式中。 最后,输出得到的后缀表达式即为"c"。 需要注意的是,中缀后缀的算法中还涉及到对运算符优先级的处理,不同运算符具有不同的优先级,根据具体的运算符优先级规则进行处理。同时,也需要考虑到括号的影响,所以在遍历过程中需要根据遇到的括号进行相应的处理操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值