中缀到postfix表达式转换代码不起作用

时间:2012-10-09 05:31:31

标签: c++

以下是我在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);
}

1 个答案:

答案 0 :(得分: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;
}
相关问题