У меня есть домашнее задание и его просто прослушивание в течение последних двух дней, я делаю именно то, что псевдокод и до сих пор еще не получил его. Например, если я ввел «mike» или «mike» 123 », моя программа выйдет из строя из-за того, что стек пуст ... Из того, что я наблюдаю, программа выйдет из строя, когда: - Стек пуста - И есть закрывающая скобка PS: с помощью us2012 я могу исправить проблему сбоя. Однако результат неверен. Вместо распечатки «недействителен», он выдает «действительный»Анализ партирования с использованием класса шаблонов стека в C++
:(
Вот псевдокод из моего профессора:
def parse_parenthesis(str):
stack = create a new empty stack of OpenParen objects
for i from 0 to str.size() - 1:
if str[i] is an open parenthesis
stack.push(new OpenParen(str[i]))
else if str[i] is not a close parenthesis:
# str[i] is not a parenthesis of any kind, so ignore it
continue
# otherwise str[i] must be a close parenthesis, try to
# match it with the most recent open paren, on the top
# of the stack
else if stack is empty
return false;
else if stack.peek() is of the same type as str[i]:
# close properly
stack.pop()
else
return false;
if stack is not empty
return false;
else
return true
и вот то, что я до сих пор:
.cpp файл
bool ParenMatching(const string& s, unique_ptr<string>& output)
{
unique_ptr<OpenParen> stack(new OpenParen);
bool validOpen, validClose, valid;
bool match; //haveCloseParen;
/*string unMatch = "Unmatch";
string unExpected = "Unexpected close paren";
string noError = "No Error";*/
for (size_t i = 0; i < s.length(); i++)
{
// check if its open parenthesis
validOpen = stack->IsOpenParen(s[i]);
// check if its close parenthesis
validClose = stack->IsCloseParen(s[i]);
// if there is open paren, push into the stack
if(validOpen)
stack->PushObj(s[i]);
else if(!validClose)
{
continue;
}
else if(stack->GetObj().IsEmpty())
valid = false;
else if(match = IsMatchParen(s[i], stack))
stack->PopObj();
else
valid = false;
}
if(!stack->GetObj().IsEmpty())
valid = false;
else
valid = true;
return valid;
}
bool IsMatchParen(const char c, const unique_ptr<OpenParen>& stack)
{
bool valid;
if(c == ')' && stack->PeekObj() == '(')
valid = true;
else if (c == ']' && stack->PeekObj() == '[')
valid = true;
else if (c == '}' && stack->PeekObj() == '{')
valid = true;
else if (c == '>' && stack->PeekObj() == '<')
valid = true;
else
valid = false;
return valid;
}
OpenParen.cpp
// Check if its open paren
bool OpenParen::IsOpenParen(const char c)
{
bool isOpen;
if(c == '(' || c == '[' || c == '{' || c == '<')
isOpen = true;
else
isOpen = false;
return isOpen;
}
// check if its close paren
bool OpenParen::IsCloseParen(const char c)
{
bool isClose;
if(c == ')' || c == ']' || c == '}' || c == '>')
isClose = true;
else
isClose = false;
return isClose;
}
Это действительно немного слишком много кода, чтобы ожидать, что мы отлаживать все. Попробуйте локализовать проблему и подробно расскажите о своей проблеме. – us2012
Благодарим вас за предложение. Я удалил какой-то код, который, по моему мнению, не будет иметь отношения к моему вопросу. Пожалуйста, посмотрите, что я сделал неправильно. –
'OpenParem :: IsOpenParen' может быть реализован как просто' return c == '(' || c == '[' || c == '{' || c == '<'; ', и он должен 't быть методом экземпляра вообще и вместо этого просто функцией. То же самое касается 'IsCloseParen'. –