현재 스택 벡터를 사용하여 클래스를 구현하려고합니다. 클래스는 다른 객체에 대한 스택으로 작동하지만 내부적으로 최대 크기의 다른 스택에 데이터를 분산합니다. 스택이 꽉 찼다면 새로운 스택이 생성되어 내부 벡터로 푸시됩니다.어떻게 스택 벡터를 구현할 수 있습니까?
감사합니다.
샘플 코드 :
#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_back
의 new
가 불필요하다고했다. 이 라인뿐만 아니라
stacks.push_back(new stack<T>);
: 추가 오류가 나는 stacks[current_stack].push_back(new stackT>());
는 그냥 stacks.push_back(stackT>());
일반적인 아이디어가있는 것 같습니다. 구체적으로 작동하지 않는 것 같습니다. 몇 개의 코멘트 : 1.'push() '루틴에서'size()> max_stack_size'를 체크하고 있다면, 아마도'size()> = max_stack_size'를 원할 것입니다. 2. push 루틴에서'new stack'을 호출하기 때문에'current_stack -'을 할 때'pop()'루틴에서'delete'를 호출해야합니다. 당신은 또한'~ SetOfStack()'의 모든 것을'delete'해야합니다. –
Dtor
아,'pop()'은'return value; '을 잊어 버린 것처럼 보입니다. – Dtor
귀하의 의견에 감사드립니다. 내가 얻는 오류는''StackOutput (new stack); '에서 필요로하는'SetOfStack :: SetOfStack (int) [T = int] '의 인스턴스화에서입니다. –
Koogle