9.3栈跟队列(二)——用一个数组来实现三个栈
9.3栈和队列(二)——用一个数组来实现三个栈
/**
* 功能:用一个数组来实现三个栈
*/
两种思路:固定分割和弹性分割
方法一:固定分割
//固定分割 int stackSize=100; int[] buffer=new int[3*stackSize]; int[] stackPointer={-1,-1,-1}; public void push(int stackNum,int value) throws Exception{ if( stackPointer[ stackNum]+1>= stackSize) throw new Exception( "Out of space."); stackPointer[ stackNum]++; buffer[absTopOfStack( stackNum)]= value; } public int pop(int stackNum) throws Exception{ if( stackPointer[ stackNum]==-1) throw new Exception( "Trying to pop an empty stack."); int value= buffer[absTopOfStack( stackNum)]; buffer[absTopOfStack( stackNum)]=0; stackPointer[ stackNum]--; return value; } public int peek(int stackNum){ return buffer[absTopOfStack( stackNum)]; } public boolean isEmpty( int stackNum){ return stackPointer[ stackNum]==-1; } //返回栈stackNum栈顶元素的索引,绝对量 public int absTopOfStack( int stackNum){ return stackNum* stackSize+ stackPointer[ stackNum]; }
方法二:弹性分割
//弹性分割 /** * 思路:当一个栈的元素个数超出其初始容量时,就将这个栈扩容至许可的容量,必要时还要搬移元素。 * 将数组设计成环状,最后一个栈可能从数组末尾开始,环绕到数组开头。 */ class StackData{ int size=0; int start; int capacity=0; int pointer=0; public StackData( int start, int capacity){ this. start= start; this. capacity= capacity; } public boolean isWithinStack( int index, int totalSize){ if( start<= index&& index< start+ capacity) return true; else if( start+ capacity> totalSize&& index<( start+ capacity)% totalSize) return true; return false; } } class SolutionB{ static int numOfStack=3; static int defaultSize=4; static int totalSize=numOfStack*defaultSize; static StackData[] stacks={ new StackData(0, defaultSize), new StackData(defaultSize, defaultSize ), new StackData( defaultSize*2, defaultSize)}; static int[] buffer=new int[totalSize]; public static int numberOfElements(){ return stacks[0]. size+ stacks[1]. size+ stacks[2]. size; } public static int nextElements( int index){ if( index+1>= totalSize) return 0; else return index+1; } public static int previousElements( int index){ if( index==0) return totalSize-1; else return index-1; } //以相反顺序搬移元素 public static void shift(int stackNum){ StackData stack= stacks[ stackNum]; if( stack. size>= stack. capacity){ int nextStack=( stackNum+1)% numOfStack; shift(nextStack); stack. capacity++; } for( int i=( stack. size+ stack. capacity-1)% totalSize; stack.isWithinStack( i, totalSize); previousElements(i)){ buffer[ i]= buffer[ previousElements(i)]; } stack. start=0; stack. start= nextElements(stack.start); stack. pointer= nextElements(stack.start); stack. capacity--; } /*搬移到其他栈上,以扩大容量*/ public static void expand(int stackNum){ shift((stackNum+1)%totalSize); stacks[ stackNum]. capacity++; } public static void push(int stackNum,int value) throws Exception{ StackData stack= stacks[ stackNum]; //检查空间是否足够 if( stack. size>= stack. capacity){ if( numberOfElements()>=totalSize) throw new Exception( "Out fo space."); else expand(stackNum); } stack. size++; stack. pointer= nextElements(stack.pointer); buffer[ stack. pointer]= value; } public static int pop(int stackNum) throws Exception{ StackData stack= stacks[ stackNum]; if( stack. size==0) throw new Exception( "Tryint to pop an empty stack."); int value= buffer[ stack. pointer]; buffer[ stack. pointer]=0; stack. pointer= previousElements(stack.pointer); stack. size--; return value; } public static int peek(int stackNum) throws Exception{ StackData stack= stacks[ stackNum]; return buffer[ stack. pointer]; } public static boolean isEmpty( int stackNum){ StackData stack= stacks[ stackNum]; return stack. size==0; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。