鱼C论坛

 找回密码
 立即注册
查看: 856|回复: 0

[技术交流] 数据结构与算法 中缀表达式转后缀表达式

[复制链接]
发表于 2022-2-2 13:50:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
花了一天半 终于把中缀表达式转后缀表达式的代码写了出来 特地发此贴给各位作为参考

有优化建议各位可以提出

  1. #include <iostream>
  2. #include <string>
  3. #include <stack>
  4. /*
  5.     1.初始化两个栈 一个符号栈(operatorStack) 另一个表达式栈(expressionStack)
  6.     2.定义一个指针(索引)index 从左至右扫描中缀表达式
  7.     3.遇到数字 将其压入表达式栈(
  8.     4.遇到符号 将其压入符号栈 并于其栈顶的符号进行比较
  9.         (1).如果符号栈为空 或栈顶的符号为"(" 则直接将当前符号压入栈
  10.         (2).否则,若当前符号的优先级比栈顶符号的优先级高 则将当前的符号压入栈
  11.         (3).若当前符号的优先级比栈顶符号低或相等 则将栈顶符号弹出压入表达式栈 再转到4.1与符号栈中的新的栈顶符号进行比较
  12.     5.遇到括号时
  13.         (1).如果是左括号"(" 则直接压入栈
  14.         (2).如果是右括号")" 则依次弹出符号栈中的栈顶符号并压入表达式栈 直到遇到左括号"("停止
  15.     6.重复2 - 5 的步骤 直到表达式的末尾
  16.     7.将符号栈中的剩余的符号依次弹出并压入表达式栈
  17.     8.依次弹出表达式栈 结果的逆序即为中缀表达式的后缀表达式
  18. */

  19. class IEToPE //中缀表达式(IndixExpression)转后缀表达式类
  20. {
  21. public:
  22.     void bind(std::string);
  23.     std::string getResult() const;

  24. private:
  25.     void ToPe();                                //最主要的处理函数
  26.    
  27.     bool isOperator(char);                //符号判断 目前支持"+" "-" "*" "/"
  28.     int operatorPriority(char);        //符号优先级判断

  29.     void compare(char data);        //用于运算符处理
  30.     std::string Result;                        //中缀表达式转后缀表达式的结果 用gerResult()函数获取
  31.     std::string InfixExpression;        //中缀表达式
  32.     std::stack<char> operatorStack;//符号栈
  33.     std::string* expressionStack;        //表达式栈
  34.     int expressionStackIndex;
  35. };
  36. std::string IEToPE::getResult() const
  37. {
  38.     if(InfixExpression.empty())
  39.     {
  40.         return NULL;
  41.     }
  42.     return Result;
  43. }
  44. void IEToPE::compare(char data)
  45. {
  46.     // 4.遇到符号 将其压入符号栈 并于其栈顶的符号进行比较
  47.     //     (1).如果符号栈为空 或栈顶的符号为"(" 则直接将当前符号压入栈
  48.     //     (2).否则,若当前符号的优先级比栈顶符号的优先级高 则将当前的符号压入栈
  49.     //     (3).若当前符号的优先级比栈顶符号低或相等 则将栈顶符号弹出压入表达式栈 再转到4.1与符号栈中的新的栈顶符号进行比较
  50.     if (this->operatorStack.empty() || (operatorStack.top() == '(')) //(1).如果符号栈为空 或栈顶的符号为"(" 则直接将当前符号压入栈
  51.     {
  52.         operatorStack.push(data);
  53.     }
  54.     else if (this->operatorPriority(data) > this->operatorPriority(this->operatorStack.top()))
  55.     { //(2).否则,若当前符号的优先级比栈顶符号的优先级高 则将当前的符号压入栈
  56.         operatorStack.push(data);
  57.     }
  58.     else
  59.     { //(3).若当前符号的优先级比栈顶符号低或相等 则将栈顶符号弹出压入表达式栈 再转到4.1与符号栈中的新的栈顶符号进行比较
  60.         expressionStack[expressionStackIndex] = operatorStack.top();
  61.         operatorStack.pop();
  62.         expressionStackIndex++;
  63.         this->compare(data);
  64.     }
  65. }

  66. int IEToPE::operatorPriority(char data)
  67. {
  68.     if (data == '*' || data == '/')
  69.     {
  70.         return 1;
  71.     }
  72.     else if (data == '+' || data == '-')
  73.     {
  74.         return 0;
  75.     }
  76.     else
  77.     {
  78.         return -1;
  79.     }
  80. }

  81. bool IEToPE::isOperator(char Operator)
  82. {
  83.     return (Operator == '+' || Operator == '-' || Operator == '*' || Operator == '/');
  84. }

  85. void IEToPE::bind(std::string InfixExpression)
  86. {
  87.     this->InfixExpression = InfixExpression;
  88.     ToPe();
  89. }

  90. void IEToPE::ToPe()
  91. {
  92.     int index = 0;
  93.     this->expressionStackIndex = 0;
  94.     std::string number;
  95.     this->expressionStack = new std::string[128];

  96.     while (index < this->InfixExpression.length())
  97.     {
  98.         if (isOperator(this->InfixExpression[index]))
  99.         {
  100.             // 4.遇到符号 将其压入符号栈 并于其栈顶的符号进行比较
  101.             compare(this->InfixExpression[index]);
  102.             index++;
  103.         }
  104.         else if (this->InfixExpression[index] == '(' || this->InfixExpression[index] == ')')
  105.         {
  106.             /*
  107.              5.遇到括号时
  108.                 (1).如果是左括号"(" 则直接压入栈
  109.                 (2).如果是右括号")" 则依次弹出符号栈中的栈顶符号并压入表达式栈 直到遇到左括号"("停止
  110.             */
  111.             if (this->InfixExpression[index] == '(')
  112.             {
  113.                 this->operatorStack.push(InfixExpression[index]);
  114.             }
  115.             else
  116.             {
  117.                 while (operatorStack.top() != '(')
  118.                 {
  119.                     this->expressionStack[this->expressionStackIndex] = operatorStack.top();
  120.                     operatorStack.pop();
  121.                     this->expressionStackIndex++;
  122.                 }
  123.                 operatorStack.pop();
  124.             }
  125.             index++;
  126.         }
  127.         else
  128.         {

  129.             while (!isOperator(this->InfixExpression[index]) && this->InfixExpression[index] >= '0' && this->InfixExpression[index] <= '9')
  130.             {
  131.                 number += this->InfixExpression[index];
  132.                 index++;
  133.             }
  134.             this->expressionStack[this->expressionStackIndex] = number;
  135.             this->expressionStackIndex++;
  136.             number = "";
  137.         }

  138.     }

  139.     /* 7.将符号栈中的剩余的符号依次弹出并压入表达式栈        
  140. 8.依次弹出表达式栈 结果的逆序即为中缀表达式的后缀表达式*/
  141.     while (!this->operatorStack.empty())
  142.     {
  143.         this->expressionStack[this->expressionStackIndex] = operatorStack.top();
  144.         operatorStack.pop();
  145.         this->expressionStackIndex++;
  146.     }
  147.     index = 0;


  148.     while (this->expressionStackIndex != index)
  149.     {
  150.         Result += this->expressionStack[index] + " ";
  151.         index++;
  152.     }
  153. }

  154. int main()
  155. {
  156.     std::string expression = "(3+4)*5-6";
  157.     IEToPE *IP = new IEToPE;
  158.     IP->bind(expression);
  159.     std::cout << expression << "==>" << IP->getResult();

  160.     return 0;
  161. }


复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
傻眼貓咪 + 5 + 5 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 14:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表