How to implement 3 stacks with one array?

后端 未结 19 2705
迷失自我
迷失自我 2021-01-29 18:44

Sometimes, I come across the following interview question: How to implement 3 stacks with one array ? Of course, any static allocation is not a solution.

19条回答
  •  醉酒成梦
    2021-01-29 19:21

    enum stackId{LEFT, MID, RIGHT };
    

    class threeStacks {

    int* arr;
    
    int leftSize;
    int rightSize;
    int midSize;
    int mid;
    int maxSize;
    public:
        threeStacks(int n):leftSize(0), rightSize(0), midSize(0), mid(n/2), maxSize(n)
        {
            arr = new int[n];
        }
    
        void push(stackId sid, int val){
            switch(sid){
                case LEFT:
                    pushLeft(val);
                break;
    
                case MID:
                    pushMid(val);
                break;
    
                case RIGHT:
                    pushRight(val);
            }
        }
    
        int pop(stackId sid){
            switch(sid){
                case LEFT:
                    return popLeft();
                case MID:
                    return popMid();
                case RIGHT:
                    return popRight();
            }
        }
    
    
        int top(stackId sid){
            switch(sid){
                case LEFT:
                    return topLeft();
                case MID:
                    return topMid();
                case RIGHT:
                    return topRight();
            }
        }
    
        void pushMid(int val){
            if(midSize+leftSize+rightSize+1 > maxSize){
                cout << "Overflow!!"< 1)
                        freeSpace /= 2;
                    for(int i=0; i< midSize; i++){
                        arr[(mid - midSize/2) - freeSpace + i] = arr[(mid - midSize/2) + i];
                    }
                    mid = mid-freeSpace;
                break;
                case RIGHT:
                    freeSpace = maxSize - rightSize - (mid + midSize/2) - 1;
                    if(freeSpace < 1)
                        return false;               
                    if(freeSpace > 1)
                        freeSpace /= 2;
                    for(int i=0; i< midSize; i++){
                        arr[(mid + midSize/2) + freeSpace - i] = arr[(mid + midSize/2) - i];
                    }
                    mid = mid+freeSpace;
                break;              
                default:
                    return false;
            }
        }
    
        void pushLeft(int val){
            if(midSize+leftSize+rightSize+1 > maxSize){
                cout << "Overflow!!"< maxSize){
                cout << "Overflow!!"<

    };

提交回复
热议问题