Реализация стека для оценки выражений
Я написал следующий код, чтобы определить, имеет ли выражение, введенное пользователем, правильную последовательность скобок или нет, например, если пользователь вводит [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 ответа
system
находится в шапкеcstdio
, но вы не сделали#include
этот заголовок.Во всяком случае, лучше не использовать такие "хитрости", как
system("pause")
сохранить окно консоли после завершения вашей программы: если ваша консольная среда не зависает после того, как ваша программа закончила свою значимую работу, то это ошибка / проблема вашей консольной среды, и вы должны правильно ее настроить, чтобы этого не произошло. Приостановка не является частью работы вашей программы.Ловля выглядит так:
catch (Type object-name) { code }
object-name
необязательно, ноType
не является.Следовательно
catch (6)
плохо сформирован. Другие ошибки являются результатом этой ошибки: разбор вашей программы становится совершенно бесполезным, когда вы пишете вещи, которые не являются допустимыми для C++!
И твой отступ довольно ужасен.
C++ не может поймать 5
, но C++ может поймать int
, Изменить все экземпляры catch(5)
в catch(int)
и это решит эту проблему.
Кроме того, в строке 60 .....
не комментируется, и в нескольких местах вы сравниваете string s
в '{'
символы вместо "{"
строки.
Также Томалак Гереткаль отметил, что нужно #include <cstdlib>
для system
а также exit
звонки.