zoukankan      html  css  js  c++  java
  • Cracking the Coding Interview Q3.1

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

    思路1:fixed division

    package Question3_1;
    
    import java.util.EmptyStackException;
    
    public class Question {
        static int stackSize = 10;
        static int [] buffer = new int [stackSize * 3];
        
        // 3 stack pointers to keep track of the index of the top element
        static int [] stackPointer = {-1, -1, -1};
        public static void main(String [] args) throws Exception  {
            push(2, 4);
            System.out.println("Peek 2: " + peek(2));
            push(0, 3);
            push(0, 7);
            push(0, 5);
            System.out.println("Peek 0: " + peek(0));
            pop(0);
            System.out.println("Peek 0: " + peek(0));
            pop(0);
            System.out.println("Peek 0: " + peek(0));
        }
    
        static void push(int stackNum, int value) throws Exception {
            /* Check that we have space for the next element */
            if (stackPointer[stackNum] + 1 >= stackSize) { 
                throw new FullStackException();
            }
            /* Increment stack pointer and then update top value*/        
            stackPointer[stackNum]++;
            buffer[absTopOfStack(stackNum)] = value;    
        }
    
        static int pop(int stackNum) throws Exception {
            if (isEmpty(stackNum)) {
                throw new EmptyStackException();
            }
            int value = buffer[absTopOfStack(stackNum)]; // Get top
            buffer[absTopOfStack(stackNum)] = 0; // Clear index
            stackPointer[stackNum]--; // Decrement pointer
            return value;
        }
    
        static int peek(int stackNum) {
            if (isEmpty(stackNum)) {
                throw new EmptyStackException();
            }        
            return buffer[absTopOfStack(stackNum)];
        }
    
        static boolean isEmpty(int stackNum) {
            return stackPointer[stackNum] == -1;
        }
        
        /* returns index of the top of the stack "stackNum", in absolute terms */
        static int absTopOfStack(int stackNum) {
            return stackNum * stackSize + stackPointer[stackNum];
        }    
    }

    思路2:

    package Question3_1;
    
    import CtCILibrary.AssortedMethods;
    
    public class QuestionB {
        static int number_of_stacks = 3;
        static int default_size = 4;
        static int total_size = default_size * number_of_stacks;
        static StackData [] stacks = {new StackData(0, default_size), 
                                         new StackData(default_size, default_size), 
                                         new StackData(default_size * 2, default_size)};
        static int [] buffer = new int [total_size];
    
        public static void main(String [] args) throws Exception  {
            push(0, 10);
            push(1, 20);
            push(2, 30);
            
            push(1, 21);
            push(0, 11);
            push(0, 12);
            
            pop(0);
            
            push(2, 31);
            
            push(0, 13);
            push(1, 22);
            
            push(2, 31);
            push(2, 32);
            push(2, 33);
            push(2, 34);
    
            System.out.println("Final Stack: " + AssortedMethods.arrayToString(buffer));
            
            pop(1);
            push(2, 35);
            
            System.out.println("Final Stack: " + AssortedMethods.arrayToString(buffer));
        }
        
        public static int numberOfElements() {
            return stacks[0].size + stacks[1].size + stacks[2].size;
        }
        
        public static int nextElement(int index) {
            if (index + 1 == total_size) {
                return 0;
            } else {
                return index + 1;
            }
        }
        
        public static int previousElement(int index) {
            if (index == 0) {
                return total_size - 1;
            } else {
                return index - 1;
            }
        }
        
        public static void shift(int stackNum) {
            StackData stack = stacks[stackNum];
            if (stack.size >= stack.capacity) {
                int nextStack = (stackNum + 1) % number_of_stacks;
                shift(nextStack); // make some room
                stack.capacity++;
            }
            for (int i = (stack.start + stack.capacity - 1) % total_size; // end of array
                          stack.isWithinStack(i, total_size); 
                          i = previousElement(i)) {
                buffer[i] = buffer[previousElement(i)];
            }
            buffer[stack.start] = 0;
            stack.start = nextElement(stack.start); // move start start
            stack.pointer = nextElement(stack.pointer); // move stack pointer
            stack.capacity--; // return capacity to original
        }
        
        /* Expand stack by shifting over other stacks */
        public static void expand(int stackNum) {
            shift((stackNum + 1) % number_of_stacks);
            stacks[stackNum].capacity++;
        }
    
        static void push(int stackNum, int value) throws Exception {
            StackData stack = stacks[stackNum];
            /* Check that we have space */
            if (stack.size >= stack.capacity) {
                if (numberOfElements() >= total_size) { // Totally full
                    throw new Exception("Out of space."); 
                } else { // just need to shift things around
                    expand(stackNum);
                }
            }
            /* Find the index of the top element in the array + 1, 
             * and increment the stack pointer */    
            stack.size++;
            stack.pointer = nextElement(stack.pointer);        
            buffer[stack.pointer] = value;    
        }
    
        static int pop(int stackNum) throws Exception {
            StackData stack = stacks[stackNum];        
            if (stack.size == 0) {
                throw new Exception("Trying to pop an empty stack.");
            }
            int value = buffer[stack.pointer];
            buffer[stack.pointer] = 0;
            stack.pointer = previousElement(stack.pointer);
            stack.size--;
            return value;
        }
    
        static int peek(int stackNum) {
            StackData stack = stacks[stackNum];            
            return buffer[stack.pointer];
        }
    
        static boolean isEmpty(int stackNum) {
            StackData stack = stacks[stackNum];
            return stack.size == 0;
        }
    }
    
    
    package Question3_1;
    
    public class StackData {
        public int start;
        public int pointer;
        public int size = 0;
        public int capacity;
        public StackData(int _start, int _capacity) {
            start = _start;
            pointer = _start - 1;
            capacity = _capacity;
        }
        
        public boolean isWithinStack(int index, int total_size) {
            // Note: if stack wraps, the head (right side) wraps around to the left. 
            if (start <= index && index < start + capacity) { 
                // non-wrapping, or "head" (right side) of wrapping case
                return true;
            } else if (start + capacity > total_size && 
                       index < (start + capacity) % total_size) {
                // tail (left side) of wrapping case
                return true;
            }
            return false;
        }
    }
  • 相关阅读:
    DeFi之道丨科普:一分钟了解以太坊layer2扩容
    4.B-Air302(NB-IOT)-功能扩展-Android扫码绑定Air302,并通过MQTT实现远程控制和监控PLC(三菱Fx1s-10MR)
    Air302(NB-IOT)-硬件BUG-电路硬件错误及其修改说明
    4.2-Air302(NB-IOT)-自建MQTT服务器-Android扫码绑定Air302,并通过MQTT实现远程通信控制
    Android 开发:数据库操作-android 使用 litepal 操作本地数据库
    0.5-Air302(NB-IOT)-连接自建MQTT服务器
    0.1-Air302(NB-IOT)-刷AT指令固件
    STM32+ESP8266+AIR202基本控制篇-00-开发板回收说明
    21-STM32+ESP8266+AIR202/302远程升级方案-扩展应用-移植远程升级包实现STM32F407VET6+串口网络模组(ESP8266/Air202/Air302)使用http或者https远程升级单片机程序
    数据处理思想和程序架构: 单片机STM32F407xx/F405xx/F415xx/417xx系列flash存储方案
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3901648.html
Copyright © 2011-2022 走看看