java中栈和队列的实现

一、栈

栈是一种先进后出的数据结构。并不是什么深奥的概念,当你想把许多东西放入到一个容器里,当你想取出来时,是按照最后放入的东西先取出来的顺序时,就要想到栈。

将栈类比为一个箱子,书类比为栈中的数据。现在往空箱子中放书,第一本书先放在箱子中的最底层,接着放第二本、第三本...。当从箱子中取出书时,首先取出的一定是最上面的那本书(是最后放的那本书,而不是最开始放的那本书)。下图所示是元素入栈的过程示意图。

下面将用java代码实现栈这种数据结构(使用数组实现)。

先编写MyStack.java类:

public class MyStack {
       //使用数组来实现栈,声明一个数组
	  int[] Arr;
	   //构造方法
	  public MyStack() {
		  Arr = new int[0];
	  }
	  
	    //压入元素的方法push
	  public void push(int element) {
	      //创建一个新数组
		  int[] newArr = new int[Arr.length+1];
		  //将原数组的元素赋值到新数组
		  for(int i=0; i<Arr.length; i++) {
			  newArr[i] = Arr[i];
		  }
		  //将新增加的元素放入新数组中
		  newArr[Arr.length] = element;
		  //使用新数组替换原数组
		  Arr = newArr;
	  }
	  
	  //取出栈顶元素
	  public int pop() {
		  //若栈中没有元素,则取出的元素的下标为0-1=-1,超出下标界限。因此要抛出异常
		  if(Arr.length == 0) {
			  throw new RuntimeException("下标越界");
		  }
		  //取出数组中最后一个元素
		  int element = Arr[Arr.length-1];
		  //创建一个新的数组
		  int[] newArr = new int[Arr.length-1];
		  //将原数组中除最后一个元素以外的其他元素复制到新数组
		  for(int i=0; i<Arr.length-1; i++) {
			  newArr[i] = Arr[i];
		  }
		  //将新数组替换原数组
		  Arr = newArr;
		  //返回栈顶元素
		  return element;
	  }
	  
	  //查看栈顶元素
	  public int look() {
		  //将数组中最后一个元素返回
		  return Arr[Arr.length-1];
	  }
	  
	  //判断栈是否为空
	  public boolean isEmpty() {
		  return Arr.length==0;
	  }
}

编写测试类TestStack:

public class TestStack {
	public static void main(String[] args) {
     //创建一个栈
	  MyStack ms = new MyStack();
	  //向栈中压入数据
	  ms.push(1);
	  ms.push(2);
	  ms.push(3);
	  //查看栈顶元素
	  System.out.println(ms.look()); 
	  //取出栈顶元素
	  System.out.println(ms.pop()); 
	  System.out.println(ms.pop()); 
	  //判断栈是否为空
	  System.out.println(ms.isEmpty()); 
	}
}

二、队列

队列和栈正好相反,栈是先进后出的数据结构,而队列是先进先出的数据结构。之所以叫这种数据结构为队列,是因为这种结构像排队一样,若现在排队过去一扇门,一定是排在最前面的人(先插入队列中的数据)先过去。下图为队列结构的示意图:

下面使用java代码来实现队列(使用数组实现)。

先编写MyQueue.java类:

public class MyQueue {
      int[] Arr;
      public MyQueue() {
    	  Arr = new int[0];
      }
      //入队
	  public void add(int element) {
	      //创建一个新数组
		  int[] newArr = new int[Arr.length+1];
		  //将原数组的元素赋值到新数组
		  for(int i=0; i<Arr.length; i++) {
			  newArr[i] = Arr[i];
		  }
		  //将新增加的元素放入新数组中
		  newArr[Arr.length] = element;
		  //使用新数组替换原数组
		  Arr = newArr;
	  }
	  
	  //取出队列元素
	  public int poll() {
		  //取出数组中第1个元素
		  int element = Arr[0];
		  //创建一个新的数组
		  int[] newArr = new int[Arr.length-1];
		  //将原数组中除第一个元素以外的其他元素复制到新数组
		  for(int i=0; i<newArr.length; i++) {
			  newArr[i] = Arr[i+1];
		  }
		  //将新数组替换原数组
		  Arr = newArr;
		  //返回队列中的元素
		  return element;
	  }
	  
	  //判断栈是否为空
	  public boolean isEmpty() {
		  return Arr.length==0;
	  }
}

再编写测试类TestQueue.java:

public class TestQueue {
	public static void main(String[] args) {
     //创建一个队列
	  MyQueue mq = new MyQueue();
	  //将元素入队
	  mq.add(1);
	  mq.add(2);
	  mq.add(3);
	  mq.add(4);
	  //出队
	  System.out.println(mq.poll());
	  //判断队列是否为空
	  System.out.println(mq.isEmpty());  
	}
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值