0

以下是我在 cpp 中将中缀转换为后缀表达式的代码?我已经尝试了一切,但我的代码没有给我想要的结果?请有人帮助我....plzzzzzz。

尽管我认为代码是正确的,但它只是不起作用。我花了很多时间检查此代码并检查了 evry 行的工作,但仍然无法正常工作。

#include <iostream>
#include<conio.h>
using namespace std;

int k=-1,m=0;
int j=0;
string infi,postfi,operato;
int precedence(char s)
{
    switch(s)
    {

    case '+':
    case '-':     
    return 1;
    break;
    case '*':
    case '/':     
    return 2;
    break;
    case '$':
    return 3;
    break;
    case '(':
    return 4;
    break;
    case ')':
    return 5;
    break;
    }
}
void operat()
{
     if(k==-1)
     {

              k++;
             operato[k]=infi[j];
             //cout<<operato[0]<<"mm";
     }
     else if(precedence(infi[j])==4)
     {
          //cout<<"0000";
          k++;
          operato[k]=infi[j];
     }
     else if(precedence(infi[j])==5)
     {
          //cout<<"0000";
          while(operato[k]!='(')
          {
                                 postfi[m]=operato[k];
                                 m++;
                                 k--;
          }
          k--;
     }   
     else if(precedence(infi[j])>precedence(operato[k]))
     {
          //cout<<"0000";
          k++;
          operato[k]=infi[j];
     }
     else
     {
         //cout<<"0000";
         postfi[m]=operato[k];
         k--;
         m++;
         operat();
     }
  //cout<<postfi[0]<<"pp";   
}

int main()
{

    cin>>infi;

    while(infi[j]!='\0')
    {
                         if(infi[j]=='+'||infi[j]=='-'||infi[j]=='*'||infi[j]=='/'||infi[j]=='('||infi[j]==')'||infi[j]=='$')
                         {
                                 operat();
                                 j++;
                         }
                         else
                         {

                             postfi[m]=infi[j];
                             //cout<<postfi[0];
                             //cout<<"me"<<m<<postfi[m];
                             m++;
                             j++;
                         }
    }
    while(k!=-1)
    {
                postfi[m]=operato[k];
                //cout<<postfi[0];
                //cout<<"me"<<m;
                //cout<<"meow"<<m<<postfi[m];
                k--;
                m++;
    }
    //cout<<postfi[0];
    int g;
    for(g=0;g<m;g++)
     cout<<postfi[g];
    //getch();
    return(0);
}
4

1 回答 1

1

我尽可能将其保留为您发布的内容的原始内容,以便您可以关注它。修改它以按照您的需要进行操作,我没有优化,我没有使用 STL(因为我认为这是家庭作业,因为您没有使用 STL),并且我编写它是为了使其具有功能性和正确性。正如我所说,你必须使用它来获得你想要的优先级,但正如我所说的那样,它是有用的。同样基于我的假设,它是家庭作业:我也没有完成它,只是希望你能朝着正确的方向前进。

#include <iostream>
#include<conio.h>
using namespace std;



int precedence(char s)
{
    int rVal = -1; //Let's assume we didn't succeed
    switch(s)
    {
    case '+':
            rVal = 7;
            break;
    case '-':
            rVal = 6;
            break;
    case '*':
            rVal = 5;
            break;
    case '/':
            rVal = 4;
            break;
    case '^':
            rVal = 3;
            break;
    case '(':
            rVal = 2;
            break;
    case ')':
            rVal = 1;
            break;
    default:
            break;
    }
    return rVal; //This satisfies the warning
}

char getpres(int num)
{
    char rVal = 0;
    switch(num)
    {
    case 7:
            rVal = '+';
            break;
    case 6:
            rVal = '-';
            break;
    case 5:
            rVal = '*';
            break;
    case 4:
            rVal = '/';
            break;
    case 3:
            rVal = '^';
            break;
    case 2:
            rVal = '(';
            break;
    case 1:
            rVal = ')';
            break;
    default:
            break;
    }
    return rVal; //This satisfies the warning
}

string reorder(string temp)
{

    string rVal = "\0";
    int *array = new int[temp.length()];
    unsigned int d = 0;
    for(unsigned int x = 0; x <= temp.length(); ++x )
    {
        array[x] = precedence(temp[x]);
    }

    for(unsigned int i = 0;i< temp.length() +1;i++)
        {
            for(unsigned int j = 1;j<i;j++)
            {
                if(array[i] > array[j])
                {
                    d = array[i]; //swap

                    array[i]=array[j];
                    array[j]=d;
                }

            }

        }
        d = 0;
        for(; d < temp.length(); ++d)
        {
            rVal += getpres(array[d]);
        }
        return rVal;
}

int main()
{

    int itr=0;
    string infi = "" ,postfi = "" ,operato = "";
    std::cin>>infi;

    while(itr <= infi.length())
    {
        if(precedence(infi[itr]) > -1)
        {
            operato += infi[itr];
        }
        else
        {
            postfi += infi[itr];
        }
        ++itr;
    }


    postfi += reorder(operato);
    std::cout<<postfi<<std::endl;
    return 0;
}
于 2012-10-09T06:37:07.233 回答