(四)基于数组的栈的实现

堆栈的基本概念

堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作。
堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。

从输入和输出数据元素的位置关系看,堆栈的功能和一种火车调度装置的功能类同。

堆栈抽象数据类型
数据集合

  堆栈的数据集合可以表示为a0,a1,…,an-1,每个数据元素的数据类型可以是任意的类类型。

操作集合

(1)入栈push(obj):把数据元素obj插入堆栈。

(2)出栈pop():出栈,删除的数据元素由函数返回。

(3)取栈顶数据元素getTop():取堆栈当前栈顶的数据元素并由函数返回。

 (4)非空否notEmpty():若堆栈非空则函数返回true,否则函数返回false。

顺序栈
顺序存储结构的堆栈称作 顺序堆栈
顺序堆栈的存储结构示意图如图所示

栈的实现
public interface Stack {
	// 入栈
	public void push(Object obj) throws Exception;

	// 出栈
	public Object pop() throws Exception;

	// 获得栈顶元素
	public Object getTop() throws Exception;

	// 判断栈是否为空
	public boolean isEmpty();
}
public class SequenceStack implements Stack {

	Object[] stackObj; //对象数组
	final int defaultSize =10; //默认最大长度
	int top; //栈顶位置
	int maxSize; //最大长度
	public SequenceStack(){
		this.init(this.defaultSize);
	}
	public SequenceStack(int length){
		this.init(length);
	}
	private void init(int length){
		this.maxSize=length;
		this.top=0;
		this.stackObj=new Object[length];
	}
	@Override
	public void push(Object obj) throws Exception {
		// TODO Auto-generated method stub
        if(this.top==this.maxSize){
        	throw new Exception("堆栈已满!");
        }
        this.stackObj[this.top]=obj;
        this.top++;
	}

	@Override
	public Object pop() throws Exception {
		// TODO Auto-generated method stub
		if(this.isEmpty()){
			throw new Exception("堆栈为空!");
		}
		this.top--;
		return this.stackObj[this.top];
	}

	@Override
	public Object getTop() throws Exception {
		// TODO Auto-generated method stub
		return this.stackObj[this.top-1];
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return this.top==0;
	}

}
import java.util.Scanner;
public class SequenceStackTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
       SequenceStack stack = new SequenceStack(10);
       
       Scanner in = new Scanner(System.in);
       int temp;
       for(int i=0;i<10;i++)
       {
    	   System.out.println("请输入第"+(i+1)+"个整数:");
    	   temp = in.nextInt();
    	   stack.push(temp);
       }
       
       while(!stack.isEmpty())
       {
    	   System.out.println(stack.pop());
       }
		
	}

}
测试结果:输入的是10,9,8,7,6,5,4,3,2,1
输出的是:1,2,3,4,5,6,7,8,9,10

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值