How to implement 3 stacks with one array?

后端 未结 19 2269
迷失自我
迷失自我 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:04

    Here is my solution of N stacks in a single array.

    Some constraints will be here. that size of the array will not be less than of the number of stacks.

    I have used to customize exception class StackException in my solution. You can change the exception class for running the programme.

    For multiple stacks in an array, I managed pointers to another array.

    package com.practice.ds.stack;
    
    import java.util.Scanner;
    import java.util.logging.Logger;
    
    /** Multiple stacks in a single array */
    public class MultipleStack {
    
        private static Logger logger = Logger.getLogger("MultipleStack");
    
        private int[] array;
        private int size = 10;
        private int stackN = 1;
        private int[] pointer;
    
        public MultipleStack() {
            this.array = new int[size];
            this.pointer = new int[1];
        }
    
        public MultipleStack(int size, int stackN) throws StackException {
            if (stackN > size)
                throw new StackException("Input mismatch ! no of stacks can't be larger than size ");
            this.size = size;
            this.stackN = stackN;
            init();
        }
    
        private void init() {
            if (size <= 0) {
                logger.info("Initialize size is " + size + " so assiginig defalt size ");
                this.size = 10;
            }
            if (stackN < 1) {
                logger.info("Initialize no of Stack is " + size + " so assiginig defalt");
                this.stackN = 1;
            }
            this.array = new int[size];
            this.pointer = new int[stackN];
            initializePointer();
        }
    
        private void initializePointer() {
            for (int i = 0; i < stackN; i++)
                pointer[i] = (int)(i * Math.ceil(size / stackN) - 1);
        }
    
        public void push(int item, int sn) throws StackException {
            if (full(sn))
                throw new StackException(sn + " is overflowed !");
            int stkPointer = pointer[sn - 1];
            array[++stkPointer] = item;
            pointer[sn - 1] = stkPointer;
        }
    
        public void pop(int sn) throws StackException {
            if (empty(sn))
                throw new StackException(sn + " is underflow !");
            int peek = peek(sn);
            System.out.println(peek);
            pointer[sn - 1] = --pointer[sn - 1];
        }
    
        public int peek(int sn) throws StackException {
            authenticate(sn);
            return array[pointer[sn - 1]];
        }
    
        public boolean empty(int sn) throws StackException {
            authenticate(sn);
            return pointer[sn - 1] == (int)(((sn - 1) * Math.ceil(size / stackN)) - 1);
        }
    
        public boolean full(int sn) throws StackException {
            authenticate(sn);
            return sn == stackN ? pointer[sn - 1] == size - 1 :  pointer[sn - 1] == (int)((sn) * Math.ceil(size / stackN)) - 1;
        }
    
        private void authenticate(int sn) throws StackException {
            if (sn > stackN || sn < 1)
                throw new StackException("No such stack found");
        }
    
        public static void main(String[] args) {
            try (Scanner scanner = new Scanner(System.in)) {
                System.out.println("Define size of the stack");
                int size = scanner.nextInt();
                System.out.println("total number of stacks");
                int stackN = scanner.nextInt();
                MultipleStack stack = new MultipleStack(size, stackN);
                boolean exit = false;
                do {
                    System.out.println("1. Push");
                    System.out.println("2. Pop");
                    System.out.println("3. Exit");
                    System.out.println("Choice");
                    int choice = scanner.nextInt();
                    switch (choice) {
                    case 1:
                        try {
                            System.out.println("Item : ");
                            int item = scanner.nextInt();
                            System.out.println("Stack Number : ");
                            int stk = scanner.nextInt();
                            stack.push(item, stk);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        break;
    
                    case 2:
                        try {
                            System.out.println("Stack Number : ");
                            int stk = scanner.nextInt();
                            stack.pop(stk);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        break;
    
                    case 3:
                        exit = true;
                        break;
    
                    default:
                        System.out.println("Invalid choice !");
                        break;
                    }
                } while (!exit);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

提交回复
热议问题