如何在C ++中将中缀转换为不带括号的前缀

时间:2018-10-29 03:24:30

标签: c++

正如我在标题中提到的,我想将中缀表达式转换为前缀表达式,我知道已经有很多在线转换器和源代码可以做到这一点,但是他们的想法很相似

步骤1.反向输入字符串(中缀表达式)

第2步。将其转换为后缀表达式

第3步。反转第2步的结果(是前缀)

PS:在第一步中,需要将“(”转换为“)”,反之亦然

我用c ++实现,但是我发现如果输入没有括号(即使没有必要),它也无法取得预期的结果

例如9 / 3-4 + 2 * 5-7 * 8 =>-/ 93 + 4- * 25 * 78

但预期结果是-+-/ 934 * 25 * 78,需要输入:(((9 / 3-4)+ 2 * 5)-7 * 8)

我想知道是否有任何简单的方法可以将中缀转换为前缀(我需要使用堆栈或队列来解决此问题)?或如何在输入字符串中添加括号?

以下是我的代码的一部分(转换为后缀)

string toPostfix(vector<string>& input){

    string ans;

    while(!input.empty()){

        if(input.front().compare("/")!=0 && input.front().compare("*")!=0 && input.front().compare("+")!=0 && input.front().compare("-")!=0 && input.front().compare("(")!=0 && input.front().compare(")")!=0){
        //first element is not operator, is operand
            ans += input.front();
            input.erase(input.begin());
        }else if(input.front().compare(")") == 0){
            while(mystack.top() != "("){
                ans += mystack.top();
                mystack.pop();
            }
            input.erase(input.begin());
            mystack.pop();//remove "("
        }else{
        //stack isnt empty now, have operator
            if(!mystack.empty()){
                while(!mystack.empty() && getPriority(mystack.top())>=getPriority(input.front())){
                    ans += mystack.top();
                    mystack.pop();
                }
            }
            mystack.push(input.front());
            input.erase(input.begin());
        }

    }
    while(!mystack.empty()){
        ans += mystack.top();
        mystack.pop();
    }
    return ans;
}

0 个答案:

没有答案