C ++ инфикс в постфикс - PullRequest
       3

C ++ инфикс в постфикс

2 голосов
/ 03 октября 2010

Я получаю следующую ошибку при компиляции:

convert.cpp: In function 'std::string convert()':
convert.cpp:62: error: expected primary-expression before 'else'
convert.cpp:62: error: expected `;' before 'else'
convert.cpp:108: error: expected `}' at end of input
convert.cpp:108: error: expected `}' at end of input 
convert.cpp:108: error: expected `}' at end of input 
convert.cpp:108: error: expected `}' at end of input 
convert.cpp:108: error: expected `}' at end of input

Код:

#include<iostream>
#include<stack>
#include<string>
using namespace std;

string infix;  // infix expression string
string operand;
string operate;
stack <string> mystack; // this stack is used to push the operator
string postfix;  // postfix string where the operand is appended

//....................................................................
// this function read the infix expression from user 
string input()
{
 cout<<" Enter the damn infix expression: "<<endl; 
 getline(cin, infix);
 return infix;
}
//......................................................................
// this function checks for operator precedence in the stack
int precedence(string e)
{
int f;
if(e == "*" || e== "/" || e =="%")
 f = 2;
else
{
if(e == "+" || e == "-")
 f = 1;
}

if(e=="."){
f=0;
}

return f;

}




//....................................................................
// This function converts infix to postfix
string convert()
{ 
 for(int i=0; i<infix.length(); i++)
 { 

  switch(infix[i]){

  // operate case start  
  case '+': case'-': case'*': case'/': case'^': case '(': case ')': case'.':

  operate=infix[i];
  {
  if(mystack.empty() || precedence(operate)>= precedence(mystack.top()))
  {
    mystack.push(operate);           

   else
   {
    while(precedence(operate)<= precedence(mystack.top()))
    {
     postfix.append(mystack.top());
     mystack.pop();
    }

    mystack.push(operate); 
   }

  }
  }//operate case closed

  default:        //when operand string char is parsed
  {
                        operand=infix[i];
                        postfix.append(operand);
                        break;

  } // default case closed

  }//switch closed

 }

while(!mystack.empty())
{
 postfix.append(mystack.top())
 mystack.pop();
}

return postfix;
cout<<postfix;
}



//...................................................................
int main()
{

input();

convert();
cout<<"postfix is "<<postfix<<endl;
} 

Ответы [ 3 ]

4 голосов
/ 03 октября 2010

Похоже, что в вашем коде отсутствуют некоторые закрывающие скобки.Вот и все.

Например, посмотрите на это:

  operate=infix[i];
  {
  if(mystack.empty() || precedence(operate)>= precedence(mystack.top()))
  {
    mystack.push(operate);           

   else
   {
    while(precedence(operate)<= precedence(mystack.top()))

Где находится закрытие} перед оператором else.Просто пройдите код и исправьте эти глупые ошибки.

Было бы намного легче избавиться от этих вещей, если бы вы сделали интервалы и отступы немного аккуратнее.

1 голос
/ 03 октября 2010

Посмотрите на эти строки:

if(mystack.empty() || precedence(operate)>= precedence(mystack.top()))
{
   mystack.push(operate);           

else
1 голос
/ 03 октября 2010

Диагностика «ожидаемое первичное выражение перед другим» - это способ автора-компилятора сообщить вам, что вы грубо навязали ему «другое» без предшествующего «если» или (что равнозначно тому же) «иначе, если». Александр Рафферти правильно указывает, что это потому, что код имеет ...

if (condition) {
  // ...
  else { }

... когда, возможно, вы имели в виду ...

if (condition) {
   // ...
}
else {
}

... хотя, может быть, вы удалили целую кучу вещей случайно, и вам повезло, что удаление привело к неразборчивому коду, так что вы поймете, что что-то не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...