0

以下は、中置式を後置式に変換する cpp のコードです。私はすべてを試しましたが、私のコードは私に望ましい結果を与えていませんか? 誰か助けてください....plzzzzzz.

コードは正しいと思いますが、うまくいきません。このコードのチェックに多くの時間を費やし、すべての行の動作をチェックしましたが、まだ動作していません。

#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 に答える