在c++中实现setOfStacks

Implementing a setOfStacks in c++

本文关键字:setOfStacks 实现 c++      更新时间:2023-10-16

我正在尝试实现一组堆栈,在c++中使用向量。因此,我首先声明std::stack类型的std::vector,然后在vector中的堆栈上执行常规的push和pop操作。堆栈有一个阈值。如果向量中的堆栈已达到阈值,则向向量添加一个新堆栈。实现如下-

#define threshold 3
class setOfStacks{
std::vector<std::stack<int> > *stacks;
public:
setOfStacks(){
    stacks = new std::vector<std::stack<int> >();
};
~setOfStacks(){};
void push(int d){
    if(stacks->size()==0){
        std::stack<int> newStack;
        newStack.push(d);
        stacks->push_back(newStack);
    }
    else{
        std::stack<int> s = stacks->back();
        std::cout<<s.size()<<"n";
        if(s.size()!=threshold){
            s.push(d);
        }
        else{
            std::stack<int> newStack;
            newStack.push(d);
            stacks->push_back(newStack);
        }
        std::cout<<s.size()<<"n";
    }
}
void pop(){
    if(stacks->size()==0){
        std::cout<<"No elements in the stackn";
    }
    else{
        std::stack<int> s;
        s = stacks->back();
        if(!s.empty()){
            std::cout<<s.top()<<" is being removedn";
            s.pop();
        }
        else{
            stacks->pop_back();
            pop();
        }
    }
}
};
int main(){
setOfStacks stackSet;
stackSet.push(1);
stackSet.push(2);
stackSet.push(3);
stackSet.push(4);
stackSet.push(5);
stackSet.push(6);
stackSet.push(7);
stackSet.push(8);
stackSet.push(9);
stackSet.pop();
stackSet.pop();
stackSet.pop();
stackSet.pop();
return 0;
}

我面临的问题- 1被插入到第一个堆栈中,堆栈被插入到向量中。当我尝试插入2时,从向量返回的堆栈引用包含1,其大小低于阈值,即3,因此2被推入堆栈。但是当我尝试插入3时,由向量返回的堆栈引用在其中没有2,它再次只包含1。我不明白为什么会这样。有人能帮我一下吗?

这一行:

std::stack<int> s = stacks->back();

stacks获取stack<int>拷贝。然后,当你按压它时,你只是按压了副本。

将其更改为引用:

std::stack<int> &s = stacks->back();

那么当您使用引用进行更改时,更改将反映在堆栈向量中。