[cc150] 3.1

 3.1 Describe how you could use a single array to implement three stacks.

如果维护2个stack还可以左边一个,右边一个,现在维护3个啊!焚蛋,肿么办?!

答案里面说可以改数组,数组里面的每个node保留着当前stack的上一个index。这样每次push的时候,顺序的在数组里面放就可以了。

还有一个很大的问题就是pop,当有stack pop的时候,就会有一些unused space,并且是分散的。为了解决这个问题,可以维护一个available space. 个人认为这个space可以用一个queue来维护,初始化就是原始数组。

但是感觉这个题目真没什么意思呀,如果再加一个queue的话,仅仅为了维护一个栈,很不值。。。可能就是为了出题目而出的吧。。。算法也没什么,就是个实现题

struct StackNode { 
    int val; 
    int preIdx; 
     
    StackNode(int v, int p): val(v), preIdx(p){} 
}; 
 
class MultiStack { 
    int stackSize; 
    vector<int> p; 
     
    vector<StackNode> buffer; 
    queue<int> free_space; 
     
public: 
    MultiStack(int size){ 
        stackSize = size; 
         
        p.assign(3, -1); 
         
        for (int i = 0; i < size; i++) { 
            free_space.push(i); 
            buffer.push_back(StackNode(0,0)); 
        } 
         
         
    } 
     
    bool push(int stackNum, int val){ 
        if (free_space.empty()) { 
            return false; 
        } 
        int idx = free_space.front(); 
        free_space.pop(); 
         
         
        buffer[idx].val = val; 
        buffer[idx].preIdx = p[stackNum]; 
         
        p[stackNum] = idx; 
        return true; 
    } 
     
    pair<bool, int> pop(int stackNum){ 
        if (isEmpty(stackNum)) { 
            return pair<bool, int>(false,-1); 
        } 
         
        int ret = buffer[p[stackNum]].val; 
        free_space.push(p[stackNum]); 
         
        p[stackNum] = buffer[p[stackNum]].preIdx; 
         
        return pair<bool, int>(true, ret); 
    } 
    bool isEmpty(int stackNum){ 
        return p[stackNum] == -1; 
    } 
     
}; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值