簡體   English   中英

C ++中的中綴到后綴轉換器沒有輸出

[英]Infix to Postfix Converter in C++ gives no output

我制作了一個函數infixToPostfix() ,它將中綴表達式轉換為后綴表達式。 但是我的程序在運行時不會產生任何輸出。 請指出我程序中的錯誤。

代碼:

#include <iostream>
#include <cstring>
#include <stack>
#include <cstdlib>
using namespace std;

int isOperator(char x)
{
    return (x == '-' || x == '+' || x == '/' || x == '*');
}

int precedenceOfOperators(char x)
{
    if (x == '+' || x == '-')
    {
        return 1;
    }
    else if (x == '/' || x == '*')
    {
        return 2;
    }

    return 0;
}

char *infixToPostfix(char infix[])
{
    int i = 0, j = 0;
    stack<char> lobby;
    char *postfix = (char *)malloc((strlen(infix + 1)) * sizeof(char));
    while (infix[i] != '\0')
    {
        if (!isOperator(infix[i]))
        {
            postfix[j] = infix[i];
            i++;
            j++;
        }
        else
        {
            if (!lobby.empty())
            {
                if (precedenceOfOperators(infix[i]) > precedenceOfOperators(lobby.top()))
                {
                    lobby.push(infix[i]);
                }
                else
                {
                    postfix[j] = lobby.top();
                    lobby.pop();
                    j++;
                }
            }
            else if (lobby.empty())
            {
                lobby.push(infix[i]);
            }
        }
    }
    while (!lobby.empty())
    {
        postfix[j] = lobby.top();
        lobby.pop();
        j++;
    }
    return postfix;
}

執行:

int main()
{
    char infix[] = {'a', '-', 'b', '+', 'c', '*', 'd'};
    char *postfix = infixToPostfix(infix);
    for (int j = 0; postfix[j] != '\0'; j++)
    {
        cout << postfix[j];
    }
    return 0;
}

邏輯:

  1. 我創建了一個字符指針變量來保存我們的后綴表達式。 現在,我們遍歷我們的中綴表達式。 如果我們收到一個操作數,我們將它連接到后綴變量。 否則,如果遇到運算符,我們將繼續執行以下步驟:
  • 考慮運算符及其相對優先級('/' 和 '*' 比 '+' 和 '-' 具有更高的優先級)。
  • 如果堆棧為空或其最上面的運算符具有較低的相對優先級,則將此運算符-優先級對推入堆棧“大廳”。
  • 否則,繼續從堆棧“大廳”彈出運算符並將它們連接到后綴表達式,直到最頂層的運算符相對於當前運算符的優先級變得更弱。
  1. 如果到達 EOE,則從堆棧“大廳”中彈出每個元素(如果有),並將它們也連接到后綴表達式。

您的代碼超過了時間限制,因為它陷入了無限循環。 您尚未更新i variable - 它是循環的 else 部分中的中綴數組的索引,即當infix[i]是運算符時。 即在這部分代碼中

else
        {
            if (!lobby.empty())
            {
                if (precedenceOfOperators(infix[i]) > precedenceOfOperators(lobby.top()))
                {
                    lobby.push(infix[i]);
                }
                else
                {
                    postfix[j] = lobby.top();
                    lobby.pop();
                    j++;
                }
            }
            else if (lobby.empty())
            {
                lobby.push(infix[i]);
            }
        }

這是提供完美輸出的更新代碼。 (我根據自己的方便做了一些小改動,你可以保持代碼不變並在 else 部分添加i++

#include <iostream>
#include <cstring>
#include <stack>
#include <cstdlib>
using namespace std;

int isOperator(char x)
{
    return (x == '-' || x == '+' || x == '/' || x == '*');
}

int precedenceOfOperators(char x)
{
    if (x == '+' || x == '-')
    {
        return 1;
    }
    else if (x == '/' || x == '*')
    {
        return 2;
    }

    return 0;
}

string infixToPostfix(char infix[])
{
    int i = 0, j = 0;
    if(sizeof(infix)==0)
    {
        return "";
    }
    int n=sizeof(infix)/sizeof(infix[0]);
    stack<char> lobby;
    string postfix = "";
    while (i < n)
    {
        if (!isOperator(infix[i]))
        {   postfix=postfix+infix[i];
            i++;
            j++;
        }
        else
        {
            if (!lobby.empty())
            {
                if (precedenceOfOperators(infix[i]) > precedenceOfOperators(lobby.top()))
                {
                    lobby.push(infix[i]);
                }
                else
                {
                    postfix = postfix+lobby.top();
                    lobby.pop();
                    j++;
                }
            }
            else if (lobby.empty())
            {
                lobby.push(infix[i]);
            }
            i++;
        }
    }
    while (lobby.empty()==false)
    {
        postfix = postfix+lobby.top();
        lobby.pop();
        j++;
    }
    return postfix;
}
int main()
{
    char infix[] = {'a', '-', 'b', '+', 'c', '*', 'd'};
    string postfix = infixToPostfix(infix);
    for (int j = 0; j < postfix.size() ; j++)
    {
        cout << postfix[j];
    }
    return 0;
}
  • 再次瀏覽我的代碼后,我也發現了一些其他邏輯錯誤。 我找到了一種更好的方法,並重組了函數infixToPostfix()的 while 循環的 else 部分。
  • 而不是將中綴表達式視為字符數組,而是將其視為字符串,類似地,后綴表達式也被視為字符串。

更新infixToPostfix()

string infixToPostfix(string infix)
{
    int i = 0;
    stack<char> lobby;
    string postfix;
    if (infix.size() == 0)
    {
        return "";
    }
    while (infix[i] != '\0')
    {
        if (!isOperator(infix[i]))
        {
            postfix = postfix + infix[i];
            i++;
        }
        else
        {
            while (!lobby.empty() && precedenceOperator(infix[i]) <= precedenceOperator(lobby.top()))
            {
                postfix += lobby.top();
                lobby.pop();
            }
            lobby.push(infix[i]);
            i++;
        }
    }
    while (!lobby.empty())
    {
        postfix = postfix + lobby.top();
        lobby.pop();
    }
    return postfix;
}
  • 正如其他答案中所提到的, i variable也應該在 while 循環的 else 部分中更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM