用数组实现队列和栈

用数组结构实现大小固定的栈和队列,这是一个面试的常考题目,也是一个比较简单的题目。

 

1.实现栈结构:栈结构是先进后出的,只需要一个数组和一个记录位置的变量size,当进来一个元素,size就++,出去一个元素size就–。

 

2.实现队列结构:相对栈结构要难搞一些,队列的先进先出的,需要一个数组和三个变量,size记录已经进来了多少个元素,in记录刚进来的元素应该放在哪个位置,out表示用户要求弹出的元素所在的位置。size的作用不止于此,它还是in与out 的操作的关键信息,使得in与out解耦,避免的很多的麻烦,好像书本讲的是没有size这个变量的。当in或者out达到底部的时候就跳回0处。

 

/**

 * 固定数组实现一个队列

 * 队列先进先出,方法有push,pull,peek

 */

public class C02_ArrayToQueue {

   public static class MyQueue{

       private int out;//新进来的数 放这

     private int in;//用户要求弹出的数

      private int size;//已经进队列的个数

      

        private int arr[];

      public MyQueue(int iniSize){

            arr = new int[iniSize];

         size = 0;

          in = 0;

            out = 0;

       }

       public void push(int num){

            if(size==arr.length){

             throw new RuntimeException(“the queue is full!”);

          }

           size++;//大小扩展一个

           arr[in] = num;//赋值

            in = in==arr.length-1 ? 0 : in+1;//如果已经到达数组末尾就重新等于0

        }

       public int pull(){

          if(size==0){

             throw new RuntimeException(“the queue is empty!”);

         }

           size–;

         int t = out;//记录

            out = out==arr.length-1 ? 0 : out+1;//如果已经到达数组末尾就重新等于0

         return arr[t];

        }

       public int peek(){

          if(size==0){

             throw new RuntimeException(“the queue is empty!”);

         }

           return arr[out];

      }

   }

   public static void main(String[] args) {

      int iniSize = 3;

     MyQueue myQueue = new MyQueue(iniSize);

       myQueue.push(12);

      myQueue.push(13);

      myQueue.push(15);

      System.out.println(myQueue.pull());

     System.out.println(myQueue.pull());

     System.out.println(myQueue.pull());

     myQueue.push(23);

      myQueue.push(24);

      System.out.println(myQueue.pull());

     System.out.println(myQueue.peek());

 }

}

1

 

/**

 * 固定数组实现栈结构

 * 实现方法push,pop,peek

 * 当越界的时候抛出一个运行时异常

 * 简单面试题

 */

public class C01_ArrayToStack {

   public static class MyStack{

       private int size;//指针位置,也表示栈已经压了多少

        private int[]arr;

       MyStack(int iniSize){//构造方法初始化数组

            arr = new int[iniSize];

         size = 0;

      }

       public void push(int num){

            if(size == arr.length){

               throw new RuntimeException("栈下标越界!");

          }

           arr[size++] = num;

      }

       public int pop(){

           if(size == 0){

               throw new RuntimeException("栈中已经没有元素可以弹出!");

           }

           return arr[--size];

       }

       public int peek(){

          if(size == 0){

               throw new RuntimeException("栈中已经没有元素可以弹出!");

           }

           return arr[size];

     }

   }

   public static void main(String[] args) {

      int len = 13;

        MyStack myStack = new MyStack(len);

       for (int i = 0; i < len; i++) {

         myStack.push(i);

        }

       for (int i = 0; i < len; i++) {

         System.out.println(myStack.pop());

      }

   }

}

posted @ 2019-08-04 20:22  qxwang  阅读(46)  评论(0)    收藏  举报