数据结构与算法(Java描述)-6、栈的基本概念以及顺序栈的实现

一、堆栈的基本概念

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

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


二、堆栈抽象数据类型

数据集合 

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

操作集合 

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

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

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

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

三、顺序栈

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


四、顺序栈实现

//设计Stack接口
public interface Stack {

	//入栈
	public void push(Object obj) throws Exception;
	//出栈
	public Object pop() throws Exception;
	//得到栈顶元素
	public Object getTop() throws Exception;
	//判断栈是否为空
	public boolean isEmpty();
}

//实现SquenceStack
public class SquenceStack implements Stack{

	//对象数组
	Object stack[];
	//栈顶
	int top;
	//默认最大长度
	private final int defalutSize=10;
	//最大长度
	int maxSize;
	
	//无参构造方法
	public SquenceStack() {
		init(defalutSize);
	}
	
	//指定最大长度的构造方法
	public SquenceStack(int size) {
		init(size);
	}
	//初始化
	public void init(int size) {
		this.maxSize=size;
		this.top=0;
		stack=new Object[size];
	}
	
	
	@Override
	public void push(Object obj) throws Exception {
		if(top==maxSize) {
			throw new Exception("堆栈已满!");
		}
		
		stack[top]=obj;
		top++;
	}

	@Override
	public Object pop() throws Exception {
		if(isEmpty()) {
			throw new Exception("堆栈为空,不能删除!");
		}
		top--;
		return stack[top];
	}

	@Override
	public Object getTop() throws Exception {
		if(isEmpty()) {
			throw new Exception("堆栈为空!");
		}
		return stack[top-1];
	}

	@Override
	public boolean isEmpty() {
		return top==0;
	}

}

拓展:

Java中栈与堆的区别:

栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量。在java中,所有基本类型和引用类型都在栈中存储。栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域)。

堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中。在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象。所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用。

hashCode与对象之间的关系:

如果两个对象的hashCode不相同,那么这两个对象肯定也不同。
如果两个对象的hashCode相同,那么这两个对象有可能相同,也有可能不同。
判断两个对象是否相同,只有一种方法,就是使用==符号。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值