2015-01-04 5 views
0

현재 스택 벡터를 사용하여 클래스를 구현하려고합니다. 클래스는 다른 객체에 대한 스택으로 작동하지만 내부적으로 최대 크기의 다른 스택에 데이터를 분산합니다. 스택이 꽉 찼다면 새로운 스택이 생성되어 내부 벡터로 푸시됩니다.어떻게 스택 벡터를 구현할 수 있습니까?

감사합니다.

샘플 코드 :

#include <iostream> 
#include <stack> 
#include <vector> 
using namespace std; 

template <class T> 
class SetOfStack { 
public: 
    SetOfStack(int max_size): current_stack(0), max_stack_size(max_size) { 
      stacks.reserve(10); 
      stacks.push_back(new stack<T>); 
    } 

    ~SetOfStack() { 
      stacks.clear(); 
    }  

    void push(T value) { 
      stacks[current_stack].push(value); 
      if(stacks[current_stack].size() > max_stack_size) { 
        stacks[current_stack].push_back(new stack<T>); 
        current_stack++; 
        if(current_stack % 10 == 0 && current_stack > stacks.size()) { 
          stacks.reserve(stacks.size() + 10); 
        } 
      } 
    } 

    T pop() { 
      T value = stacks[current_stack].top(); 
      stacks[current_stack].pop(); 

      if(stacks[current_stack].size() == 0 && current_stack != 0) { 
        stacks[current_stack].pop_back(); 
        current_stack--; 
      } 
    } 

    T popAt(int index) { 
      T value = stacks[index].top(); 
      stacks[index].pop(); 
    } 

private: 
    int current_stack; 
    int max_stack_size; 
    vector< stack<T> > stacks; 
}; 


int main() { 
    // Test code 
    SetOfStack<int> s_o_s(3); 
    s_o_s.push(1); 
    cout << s_o_s.pop() << endl; 
    return 0; 
} 

솔루션 : 문제는 벡터가 이미 메모리를 할당하기 때문에 push_backnew가 불필요하다고했다. 이 라인뿐만 아니라

stacks.push_back(new stack<T>); 

: 추가 오류가 나는 stacks[current_stack].push_back(new stackT>());는 그냥 stacks.push_back(stackT>());

+1

일반적인 아이디어가있는 것 같습니다. 구체적으로 작동하지 않는 것 같습니다. 몇 개의 코멘트 : 1.'push() '루틴에서'size()> max_stack_size'를 체크하고 있다면, 아마도'size()> = max_stack_size'를 원할 것입니다. 2. push 루틴에서'new stack '을 호출하기 때문에'current_stack -'을 할 때'pop()'루틴에서'delete'를 호출해야합니다. 당신은 또한'~ SetOfStack()'의 모든 것을'delete'해야합니다. – Dtor

+0

아,'pop()'은'return value; '을 잊어 버린 것처럼 보입니다. – Dtor

+0

귀하의 의견에 감사드립니다. 내가 얻는 오류는''StackOutput (new stack ); '에서 필요로하는'SetOfStack :: SetOfStack (int) [T = int] '의 인스턴스화에서입니다. – Koogle

답변

4

당신이지고있는 오류가이 라인이었다 쓴 것이 었습니다

stacks[current_stack].push_back(new stack<T>); 

당신 때문에 스택을 비 포인터로 선언했습니다.

vector< stack<T> > stacks; 

stack<T>() 대신 new stack<T> 을 사용하려고합니다. 또한 std::stack에는 push_back의 기능이 없으므로 대신 push을 사용해야합니다.

stacks.push_back(stack<T>()); 
stacks[current_stack].push(value); 

뿐만 아니라 pop하지 pop_back() : 당신이 new를 호출 할 의도되지 않은 것 같습니다 이후

stacks[current_stack].pop(); 

하는 시점에서, 당신은 더 이상, 내 원래의 코멘트에서 언급 한 삭제 필요

+1

을 추가 할 수 있습니다 (스택 ())'- 벡터가 다른 스택을 필요로 두 경우 모두있다. 또는 그들은'resize'를 사용할 수 있습니다. –

+0

답변 해 주셔서 감사합니다. 당신 말이 맞겠지 만, vector가'stacks.push_back (새로운 스택 );에 대한 충분한 후보자가 없다는 오류가 발생합니다. – Koogle

+0

@ vector for'vector' 당신은'push_back'을 사용합니다, 그러나'stack'을 위해서 당신은 단지'push' 만 사용합니다. @Alan이 내 대답을 수정했습니다. 나는 색인 생성을 벡터에 혼동하여 뒤로 물러 섰습니다! – Dtor

관련 문제