Реализация стека для оценки выражений - PullRequest
0 голосов
/ 14 сентября 2011

Я написал следующий код, чтобы определить, имеет ли выражение, введенное пользователем, правильную последовательность скобок или нет, например, если пользователь вводит [a * (b + c)], все в порядке.Но если он входит [a * (b + c) [это не правильно.

Stacklist.cpp - это файл, который содержит реализацию связанного списка стеков и определения функций push и pop.Дисплей - это функция, которая просто показывает верхнюю запись.

#include<iostream>
#include<exception>
using namespace std;
#include"stacklist.cpp"

int main()
{
string s;
cin>>s;//user inputs the string
stacklist<int> stack1;//the class in stacklist.cpp...int because all bracket's ascii values are ints
char c;

while((c=cin.get())!=EOF)
{

   switch('c')
   {
       case '(': case '{': case '[':
           stack1.push('c');
           break;

       case ')':
           {char s=stack1.display();
              try
              {
                if(s=='(')
                  { stack1.pop();
                   continue;}
                else
                  throw 5;
              }//try block    

              catch(5) //.......(a)
              {
              cout<<"unmatched bracket error";
              exit(-1);
              }//catch over    
           }//')' case 
           break;

        case '}': //.......(b)
           {char s=stack1.display();
              try
               {
               if(s=='{')
                  { stack1.pop();
                  continue;}
               else
                  throw 6;
               }//try block    

              catch(6) //......(a)
               {
                cout<<"unmatched bracket error";
                exit(-1);
               }//catch over    
           }//'}' case
           break;

         case ']': ........(c)
           {char s=stack1.display();
             try
              {
               if(s==']')
                  { stack1.pop();
                  continue;}
               else
                  throw 7;
              }//try block    

             catch(7) //.............(a)
              {
              cout<<"unmatched bracket error";
              exit(-1);
              }//catch over    
           }//']' case  
           break;//..........(d)

         default:
             break;     
    }   //switch 

} //while  

 if(stack1.display==0)//0 is displayed if stack is empty
    cout<<"string is correct"<<endl;
 else
    cout<<"unequal number of brackets"<<endl;

  system("pause"); //........(e)
  return 0; 
}    //main

Теперь проблема в том, что когда я компилировал код, были различные ошибки:

syntax error before numeric constant.........in all (a)
case label '}' not within switch statement........(b)
case label ']' not within switch statement........(c)
syntax error before break.................(d)
ISO forbids declaration of 'system' with no type...........(e)

Подскажите пожалуйста как подключитьэти ошибки?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011
  • system находится в заголовке cstdio, но вы не указали #include этот заголовок.

    В любом случае, лучше не использовать «хитрости», такие как system("pause"), чтобы сохранить окно консоли после завершения вашей программы: если ваша консольная среда не зависает после того, как ваша программа закончила свою значимую работу, то это ваша консольная среда. ошибка / проблема, и вы должны правильно настроить ее, чтобы этого не произошло. Приостановка не является частью работы вашей программы.

  • Ловля выглядит так:

    catch (Type object-name) { code }
    

    object-name является необязательным, но Type не является обязательным.

    Поэтому catch (6) плохо сформирован. Другие ошибки являются результатом этой ошибки: разбор вашей программы становится совершенно бесполезным, когда вы пишете недопустимый текст C ++!

А ваши отступы довольно ужасны.

1 голос
/ 14 сентября 2011

C ++ не может поймать 5, но C ++ может поймать int. Измените все экземпляры catch(5) на catch(int) и это решит эту проблему.

Кроме того, в строке 60 ..... не комментируется, и в нескольких местах вы сравниваете символы string s с '{' вместо "{" строк.

Кроме того, Томалак Герет'кал отметил, что вам нужно #include <cstdlib> для вызовов system и exit.

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