java中栈和队列的操作

来源:互联网 发布:c语言字符数组长度 编辑:程序博客网 时间:2024/04/28 04:43

 通常称,栈和队列是限定插入删除只能在表的“端点”进行的线性表。

栈stack是后进先出LIFO, insert操作通常称为push,而无参数的删除操作称为pop。最先插入的元素成为“栈底元素”,最后插入的称为“栈顶元素”。

栈空条件top==0

栈满条件top==stackElem.length

栈的长度top

栈顶元素stackElem[top-1]


队列queue是先进先出FIFO,像栈操作POP一样,DEQUEUE也不需要取队列的元素作为参数。队列Q具有属性head指向队列的头元素,tail指向新元素即将被插入的地方。在最后一个位置要进行“卷绕”,即队列中的n个元素排成环形,位置1接在位置n之后。


//定义栈基本操作的接口
[java] view plaincopy
  1. package operation;  
  2.   
  3. public interface IStack {  
  4.     public void clear();  
  5.     public boolean isEmpty();  
  6.     public boolean push(Object x);//入栈操作  
  7.     public int length();  
  8.     public Object peek();//取栈顶元素  
  9.     public Object pop() throws Exception; //出战操作  
  10.     public Object min(); //取栈中的最小值,招聘中常考  
  11.     public void reverseStack(Stack s)throws Exception; //将栈中元素颠倒,招聘中常考  
  12. }  


//栈基本操作的实现
[java] view plaincopy
  1. package operation;  
  2.   
  3. /** 
  4.  * 本类针对顺序栈 
  5.  * */  
  6. public class Stack implements IStack {//实现接口  
  7.     private int[] mIndex;  
  8.     private Object[] stackElem;  
  9.   
  10.     public Object[] getStackElem() {  
  11.         return stackElem;  
  12.     }  
  13.   
  14.     public int[] getmIndex() {  
  15.         return mIndex;  
  16.     }  
  17.   
  18.     private int top;  
  19.   
  20.     public Stack(int maxSize) {  
  21.         stackElem = new Object[maxSize];  
  22.         mIndex = new int[maxSize];  
  23.         top = 0;  
  24.     }  
  25.   
  26.     public void clear() {  
  27.         // TODO Auto-generated method stub  
  28.         top = 0;  
  29.     }  
  30.   
  31.     public boolean isEmpty() {  
  32.         // TODO Auto-generated method stub  
  33.         return top == 0;//当top为0,栈为空;  
  34.     }  
  35.   
  36.     public int length() {  
  37.         // TODO Auto-generated method stub  
  38.         return top;  
  39.     }  
  40.   
  41.     // 取栈顶元素的函数  
  42.     public Object peek() {  
  43.         // TODO Auto-generated method stub  
  44.         if (!isEmpty())  
  45.     top = top - 1;
  46.             return stackElem[top+1];//top指向最新插入的元素,即栈顶。  
  47.         else  
  48.             return null;  
  49.     }  
  50.   
  51.     /** 
  52.      * 进栈操作 要求:时间复杂度是O(1) 
  53.      * */  
  54.     public boolean push(Object x) {  
  55.         // TODO Auto-generated method stub  
  56.         if (top == stackElem.length) {  
  57.             System.out.print("栈已满");  
  58.             return false;  
  59.         }  
  60.         if (top == 0) {  
  61.             mIndex[top] = 0;  
  62.         } else if ((Integer)x <(Integer)peek()&& peek() != null) {  
  63.             mIndex[top] = top;  
  64.         } else if (peek() != null) {  
  65.             mIndex[top] = mIndex[top - 1];  
  66.         }  
  67.         stackElem[top++] = x;  
  68.         return true;  
  69.   
  70.     }  
  71.   
  72.     /** 
  73.      * 顺序栈的出栈操作 时间复杂度为:O(1) 
  74.      * */  
  75.     public Object pop() throws Exception {  
  76.         // TODO Auto-generated method stub  
  77.         if (!isEmpty()) {// 若栈不空,则移去栈顶元素并返回其值  
  78.             mIndex[top - 1] = -1;  
  79.             return stackElem[--top];  
  80.         } else  
  81.             return null;// 若栈空,则返回空值  
  82.   
  83.     }  
  84.   
  85.     /** 
  86.      * 返回栈中最小的元素,需要一个辅助栈 要求:时间复杂度是O(1) 
  87.      * 解决这道题的思路在于:用空间换时间!很关键,很直白,但并不是很个人都能很灵活的运用!比如我就不能! 
  88.      * 代码实现也很简单,定义一个结构体,结构体中两个等大的数组stackElem,mIndex;一个存储数据,另一个存储最小值的下标, 
  89.      * mIndex[i]表示[0,i]区间中最小值的下标。 
  90.      * */  
  91.     public Object min() {  
  92.         if (top == 0)  
  93.             return null;  
  94.         else  
  95.             return stackElem[mIndex[top - 1]];  
  96.   
  97.     }  
  98.   
  99.   
  100.   
  101.     @Override  
  102.     /** 
  103.      * 要求用递归的方法,在不浪费空间的情况下,颠倒栈。 
  104.      * */  
  105.     public void reverseStack(Stack s) throws Exception {  
  106.         if (!s.isEmpty()) {  
  107.             Object t = s.pop();  
  108.             reverseStack(s);  
  109.             pushStackButtom(s, t);  
  110.         }  
  111.     }  
  112.   
  113.     public void pushStackButtom(Stack s, Object t) throws Exception {  
  114.         if (s.isEmpty()) {  
  115.             s.push(t);  
  116.         } else {  
  117.             Object top = s.pop();  
  118.             pushStackButtom(s, t);  
  119.             s.push(top);  
  120.         }  
  121.     }  
  122.   
  123. }  



--------------------------------------------------------------------------------------------------------------

队列
//队列基本操作的接口
[java] view plaincopy
  1. package operation;  
  2.   
  3. public interface IQueue {  
  4. public void clear();  
  5. public boolean isEmpty();  
  6. public int length();  
  7. public Object peek();  //取栈顶元素  
  8. public void enQueue(Object x)throws Exception;//入队操作  
  9. public Object deQueue();//出队操作  
  10. }  

//第一种:顺序队列的基本操作的实现
[html] view plaincopy
  1. package operation;  
  2.   
  3. /**  
  4.  * 本类针对顺序队列  
  5.  * */  
  6. public class Queue implements IQueue {  
  7.     private Object[] q;  
  8.   
  9.     private int head, tail;  
  10.   
  11.     public Queue(int maxSize) {  
  12.         q = new Object[maxSize];  
  13.         head =0;  
  14.         tail = 0;  
  15.     }  
  16.   
  17.     public Object[] getQ() {  
  18.         return q;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void clear() {  
  23.         // TODO Auto-generated method stub  
  24.   
  25.     }  
  26.   
  27.     @Override  
  28.     public boolean isEmpty() {  
  29.   
  30.         return false;  
  31.     }  
  32.   
  33.     @Override  
  34.     public int length() {  
  35.         return tail;  
  36.     }  
  37.   
  38.     @Override  
  39.     public Object peek() {  
  40.         if (!isEmpty())  
  41.             return q[tail - 1];  
  42.         return null;  
  43.     }  
  44.   
  45.     @Override  
  46.     public void enQueue(Object x) throws Exception {  
  47.         if (tail == q.length)  
  48.             throw new Exception("队列已满");  
  49.         q[tail++] = x;  
  50.   
  51.     }  
  52.   
  53.     @Override  
  54.     public Object deQueue() {  
  55.         if (!isEmpty())  
  56.             return q[head++];  
  57.         else  
  58.             return null;  
  59.     }  
  60.   
  61. }  

//第二种:循环队列(即环状的)的基本操作的实现
[java] view plaincopy
  1. package operation;  
  2.   
  3. public class CircleQueue implements IQueue{  
  4.   
  5.       
  6.     private int flag;//用来判断队列是否满  
  7.     private int head,tail;  
  8.     private Object[] q;  
  9.       
  10.       
  11.     public Object[] getQ() {  
  12.         return q;  
  13.     }  
  14.     public CircleQueue(int maxSize){  
  15.         q=new Object[maxSize];  
  16.         head=tail=0;  
  17.         flag=0;  
  18.     }  
  19.     @Override  
  20.     public void clear() {  
  21.         // TODO Auto-generated method stub  
  22.         head=tail= 0;   
  23.   
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean isEmpty() {  
  28.         // TODO Auto-generated method stub  
  29.         if(head==tail&&flag==0)  
  30.         return true;  
  31.         else   
  32.             return false;  
  33.     }  
  34.   
  35.     @Override  
  36.     public int length() {  
  37.         // TODO Auto-generated method stub  
  38.           
  39.          return   
  40.                  tail-head;  
  41.   
  42.     }  
  43.   
  44.     @Override  
  45.     public Object peek() {  
  46.         // TODO Auto-generated method stub  
  47.         if(!isEmpty())  
  48.             return q[tail];  
  49.         return null;  
  50.     }  
  51.   
  52.     @Override  
  53.     public void enQueue(Object x) throws Exception {  
  54.         // TODO Auto-generated method stub  
  55.         if(head==tail&&flag==1)//判断栈是否满了  
  56.             throw new Exception("栈已满");  
  57.         else  
  58.                     q[tail++]=x;  
  59.           
  60.     }  
  61.   
  62.     @Override  
  63.     public Object deQueue() {  
  64.         // TODO Auto-generated method stub  
  65.         if(!isEmpty())  
  66.             return q[--tail];  
  67.         return null;  
  68.     }  
  69.       
  70.   
  71. }  
0 0
原创粉丝点击