当前位置: 首页 > 知识库问答 >
问题:

分流场算法插入前缀实现

白昊乾
2023-03-14

我已经成功地在C语言中实现了分流码算法,将内缀表达式转换为后缀表达式(RPN)。我需要修改我的算法来返回前缀(抛光)表达式,但我不知道怎么做。

void Prefix::fromInfix()
{
//The stack contain the operators
std::stack<std::string> pile;
//This is the output
std::vector<std::string> sortie;
//The input is the std::vector<std::string> _expression

pile.push("(");
_expression.push_back(")");

for (auto iter = _expression.begin(); iter != _expression.end(); iter++)
{
    //statOperator detect if the token is an operator and the priority of the operator.
    short op = statOperator(*iter);
    if (*iter == "(")
        pile.push(*iter);
    else if (*iter == ")")
    {
        while (pile.top() != "(")
        {
            sortie.push_back(pile.top());
            pile.pop();
        }
        pile.pop();
    }
    else if (op)
    {
        while (!pile.empty())
        {
            short op2 = statOperator(pile.top());
            //if op2 is is have the priority and isn't a parenthesis.
            if (op <= op2 && op2 != 3)
            {
                sortie.push_back(pile.top());
                pile.pop();
            }
            else
                break;
        }
        pile.push(*iter);
    }
    else
        sortie.push_back(*iter);
}
_expression = sortie;
}

共有1个答案

西门靖琪
2023-03-14

我只需要从右向左读取输入。

for (auto iter = _expression.rbegin(); iter != _expression.rend(); iter++)

完全反转括号角色。

_expression.insert(_expression.begin(), "(");
pile.push(")");

在循环中。

if (*iter == ")")
    pile.push(*iter);
else if (*iter == "(")
{
    while (pile.top() != ")")
    {
        sortie.push(pile.top());
        pile.pop();
    }
    pile.pop();
}

并反向输出(我使用了堆栈)。

while (!sortie.empty())
{
    _expression.push_back(sortie.top());
    sortie.pop();
}
 类似资料:
  • 本文向大家介绍python插入排序算法实例分析,包括了python插入排序算法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python插入排序算法。分享给大家供大家参考。具体如下: 另外一个版本: 希望本文所述对大家的Python程序设计有所帮助。

  • KMP算法与前缀函数 (一)前缀函数 一个字符串s的border是一个最长的字符串,且既是s的后缀,又是s的真前缀。 给定长为n的字符串s,其前缀函数定义为一个长为n的数组π。其中π[i]为s的第i个前缀的border长度。 (二)KMP算法 全称为 Knuth-Morris-Pratt 算法,是由 Knuth, Morris 和 Pratt 这三个人创造的算法,可以在O(n+m)的时间内使用 O

  • 本文向大家介绍C++插入排序算法实例,包括了C++插入排序算法实例的使用技巧和注意事项,需要的朋友参考一下 插入排序 没事喜欢看看数据结构和算法,增加自己对数据结构和算法的认识,同时也增加自己的编程基本功。插入排序是排序中比较常见的一种,理解起来非常简单。现在比如有以下数据需要进行排序: 10 3 8 0 6 9 2 当使用插入排序进行升序排序时,排序的步骤是这样的: 10 3 8 0 6 9 2

  • 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 所有输入只包含小写字母 a-z 。 话不多说,上code: /** * @param {stri

  • 本文向大家介绍C#二叉搜索树插入算法实例分析,包括了C#二叉搜索树插入算法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#二叉搜索树插入算法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 主要内容:插入排序算法的具体实现插入排序算法可以对指定序列完成升序(从小到大)或者降序(从大到小)排序,对应的时间复杂度为 。 插入排序算法的实现思路是:初始状态下,将待排序序列中的第一个元素看作是有序的子序列。从第二个元素开始,在不破坏子序列有序的前提下,将后续的每个元素插入到子序列中的适当位置。 举个简单的例子,用插入排序算法对 {14, 33, 27, 10, 35, 19, 42, 44} 实现升序排序的过程如下: 1)