堆栈的基本概念
堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作。
堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。
从输入和输出数据元素的位置关系看,堆栈的功能和一种火车调度装置的功能类同。
堆栈抽象数据类型
数据集合
堆栈的数据集合可以表示为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