asdasdsadasd

数据结构(一)--------栈

简单介绍一下数据结构中的栈.栈是什么呢?通俗的打个比喻.栈就是有一个死胡同,胡同宽度是只能容一个人进入的宽度,这时候小明进去了,走到了胡同的最里面,小明就到了栈底,然后小东又进来了就到了这种状况.

                        

这个时候假如小明想出来的话,由于前面有小东挡着,他就出不来,所以,只能小东先出来,小明再出来.

栈是属于 后进先出 的,新进来的可以最先出去,如果这时候小云再进来的话,栈就如图所示

这时候小东和小明在小云不出来的前提下,是出不来的,小明如果想出来,必须让小云先出来,小东再出去,小明才可以出来. 符合后进先出的原则.

只要一个人(元素)前面还有其他的人(元素),他就不能被弹出,小云进入胡同是属于PUSH(压入)栈,小云出胡同是属于POP(弹出)栈.

相关实现的代码,我都用JAVA来写.

下面上一波代码吧

首先是栈的接口

 

package com.utils.inter;

public interface Stack {
	
	/*验证栈是否为空*/
	public boolean isEmpty();
	
	/*取出栈顶元素*/
	public Object peek();
	
	/*弹出栈顶元素*/
	public Object pop();
	
	/*向栈内压入一个元素*/
	public void push(Object obj);
}

如果不知道什么是接口,好吧,个人的理解可能有所偏见,我就把我的理解说一下吧.

 

接口说白了就是,一个总体的东西,包含什么功能,举个例子吧.

一个车的接口,车会干啥?车可以跑吧,需要加油吧,可以加速吧.大多数的车都有这些功能,然而车和车是不一样的.

比如,一个外面的出租车,速度最大能到多少?有安全气囊这种东西吗?没有对吧,但是像玛拉莎蒂这种好车就有,我们只是把它所具备的大致功能写出来,说白了就是把功能写好,你再自己实现.    

当你制作一辆车的时候,必须要考虑到,它要可以跑,要加油,可以加速. 具体可以跑多快,加油需要加多少是加满,那就要看你具体的零件怎么配置啦,不是我所关心的了.


可能我对接口的理解并不正确,本人就是个渣渣,凑合先看着吧,如果有了其他理解,随时改正.


下面是栈的具体实现代码

 

package com.utils.instan;

public class ArrayStack implements com.utils.inter.Stack {
	
	/*用一个整型数组来模拟栈*/
	int []stack = new int[5];
	
	/*类似指针的一个玩意,一直指向栈顶元素,初始为-1*/
	int index=-1;
	

	/*看此栈是否为空,空的话返回true,并在控制台打印一句话*/
	public boolean isEmpty() {
		if(index==-1){
			System.out.println("不好意思,栈空了");
			return true;}
		else{ 
			
			return false;}
	}
	
	/*得到栈顶元素,先看栈是否为空,为空的话肯定不能得到相应的元素了,所以返回null,否则返回栈顶元素*/
	public Object peek() {
		if(isEmpty())
			return null;
		else 
			return stack[index];
	}

	/*弹出栈顶元素,弹出前也要进行验证,如果栈内没有元素的话弹个锤子??有元素的话并返回栈顶元素,游标减一*/
	public Object pop() {
		if(isEmpty()){
			return null;}
		else{
			int k = index;
			index-=1;
			return stack[k];
		}
	}

	/*入栈操作,先判断栈是否满了,如果满了就创建一个新的数组,是之前数组的二倍.
	 * 然后将之前数组中的元素复制到新的数组,然后再把stack指向新的 stack2
	 * 再向栈中添加元素
	 * 没满的话就直接将新元素压入栈内就好了
	 */
	public void push(Object obj) {
		if(index==stack.length-1){
			int stack2[]=new int[index*2];
			for(int i = 0;i<stack.length;i++){
				stack2[i]=stack[i];
			}
			stack = stack2;
		
			index++;
			stack[index]=(int) obj;
		}else{
			index++;
			stack[index]=(int) obj;
		}
		
	}
<span style="white-space:pre">	</span>/*这里是进行测试,压入8个数据,然后依次弹出*/
	public static void main(String[] args) {
		ArrayStack s = new ArrayStack();
		for(int i = 0;i<8;i++){
			s.push(i);
		}
		for(;!s.isEmpty();){
			System.out.println("栈弹出:"+s.pop());
			
		}
	}
	
}

运行结果如下:

栈弹出:7
栈弹出:6
栈弹出:5
栈弹出:4
栈弹出:3
栈弹出:2
栈弹出:1
栈弹出:0
不好意思,栈空了


好啦,第一个栈的介绍就到这里啦,这是基于数组实现的栈,还有基于链表实现的栈,打算以后在写出来.




 

posted @ 2016-09-14 16:53  Lunar夜  阅读(161)  评论(0)    收藏  举报