Структура данных стека исчерпала пространство - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над проблемой структуры данных и алгоритмов на одном из курсов 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 символов. Итак, мой вопрос состоит из двух частей:

  1. Это из-за того, как я решил проблему? (что, я считаю, может быть проблемой, но не могу придумать причину, по которой ему не хватило бы места в стеке)
  2. Могу ли я принудительно увеличить размер стека, который я здесь использую?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...