JAVA 数据结构之栈实现

1、栈的实现原理

      栈用数组来实现相对较为方便,需要一个数组和一个整型变量,整型变量记录数组存入栈的下标位置,数组来顺序存储栈中的所有元素,假定数组元素用stackArray[maxSize]来表示,指示栈顶元素位置的整形变量用top来表示,通常称top为栈顶指针。这些具体的定义形式如下:

        final int maxSize=10;//初始化栈的深度为10

        private Object[] stackArray[maxSize];//申明一个数组栈

        private int top;//申明栈顶指针

      在顺序存储的栈中,top的值为-1表示栈空,每次向栈中亚茹一个元素时,首先top++,用以指示新的栈顶的位置,然后再把元素赋值到这个空的位置上,每次从占中删除一个元素时,首先取出栈顶元素,然后top--,整个时间复杂度为O(1)。

    在一个顺序存储栈中,如果top已经指向了最后一个下标的位置,则表示栈满,需要重新来生成一个更大的存储区,然后把栈的所有内容拷贝到存储区,以满足继续添加新的元素。相反,如果top的值为-1,则表示栈空,无法进行取栈的内容。


2、栈的实现代码

package sequenceStack;
import java.util.*;

public class sequencetStack extends Stack{
	final int maxSize=10;
	private int top;
	private Object[] stackArray;
	public sequencetStack(){
		top=-1;
		stackArray=new Object[maxSize];
	}
	public sequencetStack(int i) throws Exception{
		if(i<0){
			throw new Exception("数组长度太小");  //如果长度太小的话,直接抛出异常.
		}
		else{
			top = -1;
			stackArray=new Object[i];
		}
	}
	//向栈顶插入元素
	public Object push(Object obj){
		//向栈顶插入一个新元素obj
		if(top==stackArray.length-1){
			Object p[]=new Object[top*2+2];
			for(int i=0;i<=top;i++){
				p[i]=stackArray[i];
				stackArray=p;
			}
		}
		top++;
		stackArray[top]=obj;
		return null;
	}
	//从堆栈中弹出一个元素
	public Object pop(){
		if(top==-1){
			//throw new Exception("堆栈中已经没有元素了。");
			System.out.println("堆栈中已经没有元素了。");
			System.exit(0);
		}
		top--;
		return stackArray[top+1];
	}
	//读取栈顶元素的值
	public Object peek(){
		if(top==-1){
			System.out.println("堆栈中已经没有元素了。");
			System.exit(0);
		}		
		return stackArray[top];
	}
	//判断堆栈是否为空
	public boolean isEmpty(){
		return top==-1;
	}
	//清空堆栈
	public void clearStack(){
		top=-1;
	}
}
      下面是我的测试使用代码:
package sequenceStack;

import java.util.Stack;

public class testStack {
	public static void main(String args[]){
		Stack sck=new sequencetStack();
		int a[]={3,8,5,17,9,30,15,22};
		for(int i=0;i<a.length;i++){
			sck.push(a[i]);
		}
		sck.push(68);
		System.out.println(sck.peek()+","+sck.pop()+","+sck.pop());
		while(!sck.isEmpty())System.out.println(sck.pop()+" ");
		System.out.println();
		sck.clear();
	}
}
   输出结果:68,68,22
15 
30 

17 

8  

  满足栈的先入后出的特性。由于代码相对简单,所以不做累述。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值