Я работаю над проблемой структуры данных и алгоритмов на одном из курсов Coursera. Первая проблема, которая была дана нам, - это «функция соответствия скобок» для текстового редактора. Я приведу несколько коротких примеров, чтобы рассказать о желаемой функции:
Input: () or [] or {}[] or [()] .......
Output: Success
Input: {
Output: 1 (As first unmatched opening bracket and position is 1)
Input: {[}
Output: 3
Explantin: The bracket } is unmatched, because the last unmatched opening bracket before it is [ and
not {. It is the first unmatched closing bracket, and our first priority is to output the first
unmatched closing bracket, and its position is 3, so we output 3
Input: foo(bar[i)
Output: 10
Explanation: ) doesn’t match [, so ) is the first unmatched closing bracket, so we output its
position, which is 10.
Итак, в основном наш приоритет состоит в том, чтобы указать на первую непревзойденную закрывающую скобку, которая не имеет открывающей скобки перед ней или закрывает изношенную открывающую скобку. Вот некоторые ограничения для реализации:
Memory Limit: 512MB
Time Limit(C++): 1 Sec
Length of the input string can be from 1 to 10^5
Моя текущая реализация выглядит следующим образом: (я в основном передаю все открывающие скобки в стек вместе с их положением в строке)
#include <iostream>
#include <stack>
#include <string>
struct bracket_data {
char next;
int pos;
};
int main(){
std::string text;
getline(std::cin,text);
std::stack <bracket_data> char_stack;
int unmatched_pos = 0;
char top_val;
for(int pos = 0; pos < text.length(); ++pos){
char next = text[pos];
struct bracket_data data;
//std::cout << "Next char in string is: " << next << "\n";
if(next == '(' || next == '[' || next == '{') {
if(pos == text.length() - 1)
unmatched_pos = pos+1;
else{
data.next = next;
data.pos = pos;
char_stack.push(data);
std::cout<< "Data pushed is " <<data.next<< " and pos is " <<data.pos<<"\n";
}
}
else{
if(!char_stack.empty()){
top_val = char_stack.top().next;
//std::cout << "Current top val in the stack is "<<top_val
//<<"\n";
}
if(next == ')' || next == ']' || next == '}'){
if(next == ')' && top_val == '('){
char_stack.pop();
if(pos == text.length() - 1)
std::cout <<"Success\n";
//std::cout << "Round brackets match found\n";
}
else if (next == ']' && top_val == '['){
char_stack.pop();
if(pos == text.length() - 1)
std::cout <<"Success\n";
//std::cout << "Square brackets match found\n";
}
else if (next == '}' && top_val == '{'){
char_stack.pop();
if(pos == text.length() - 1)
std::cout <<"Success\n";
//std::cout << "Curly brackets match found\n";
}
else{
unmatched_pos = pos + 1;
//std::cout << "No brackets match found\n";
std::cout <<unmatched_pos<<"\n";
exit(0);
}
}
else{
if(next == '(' || next == '[' || next == '}'){
unmatched_pos = pos + 1;
std::cout <<unmatched_pos<<"\n" ;
exit(0);
//std::cout << "A single unmatched bracket found\n";
}
else
//std::cout << "Char found!\n" ;
continue;
}
}
}
}
Эта реализация пропускает 53 из 54 приведенных тестовых случаев, где она терпит неудачу в последнем ( 54th ) тестовом примере, который содержит в общей сложности 10 ^ 5 символов в строке.
Когда я печатаю, что все значения идут в стек, я вижу, что операция stack.push()
не go выходит за пределы
--------------------------------
Data pushed is ( and pos is 4090
Data pushed is { and pos is 4091
Data pushed is [ and pos is 4092
Data pushed is [ and pos is 4093
Насколько я вижу, кажется, как будто у меня не хватило места в стеке, чтобы набрать sh символов. Итак, мой вопрос состоит из двух частей:
- Это из-за того, как я решил проблему? (что, я считаю, может быть проблемой, но не могу придумать причину, по которой ему не хватило бы места в стеке)
- Могу ли я принудительно увеличить размер стека, который я здесь использую?