2020年2月28日
1.什么是栈?
栈是一种用于存储数据的简单数据结构(与链表类似)。数据人栈的次序是栈的关键。可以把自助餐厅中的一堆盘子看作一个栈的例子。当盘子洗干净后,它们会添加到栈的顶端。当需要盘子时,也是从栈的顶端拿取。所以第一个放人栈中的盘子最后才能被拿取。
定义:栈(stack)是一个有序线性表,只能在表的一端(称为栈顶,top)执行插人和删
除操作。最后插人的元素将第一个被删除。所以,栈也称为后进先出(Last In First Out,LIFO)或先进后出(First In Last Out,FILO)线性表。两个改变栈操作都有专用名称。一个称为入栈(push),表示在栈中插入一个元素;另一个称为出栈(pop),表示从栈中删除一个元素。试图对一个空栈执行出栈操作称为下溢( underflow);试图对一个满栈执行人栈操作称为溢出(overflow)。通常,溢出和下溢均认为是异常。
2.栈抽象数据类型
2.1栈的主要操作:
●void push(int data): 将data(数据)插人栈。
●int pop(): 删除并返回最后一个插人栈的元素。
2.2栈的辅助操作
●int top(): 返回最后一个插人栈的元素,但不删除。
●int size(): 返回存储在栈中元素的个数。
●int isEmpty():判断栈中是否有元素
●int isStackFull():判断栈中是否存满元素
3.实现
3.1简单数组实现
public class ArrayStack{
private int top;
private int capacity;
private int[] array;
public ArrayStack(){
capacity = 1;
array= new int[capacity];
top = -1;
}
public boolean isEmpty(){
return (top == -1);
}
public boolean isStackFull(){
return (top == capacity- 1);
}
public void push(int data){
if(this.isStackFull())
System.out.println("栈满");
else
array[++top]= data;
}
public int pop(){
if(this.isEmpty()){
System.out. println("栈空");
return 0;}
else
return ( array[top--]);
}
public void deleteStack(){
top = -1;
}
}
性能:
局限性:栈的最大空间必须预先声明且不能改变。试图对一个满栈执行入栈操作将产生一个简单数组对这种特定实现栈方式的异常。
3.2基于动态数组实现方法
当栈满时,倍增一个新的数组来,将原来的数组的元素储存到新的数组中去,然后压入新元素进栈。
public class DynArrayStack{
private int top;
private int capacity;
private int[] array;
public DynArrayStack(){
capacity= 1;
array= new int[capacity];
top = -1;
}
public boolean isEmpty(){
return (top == -1);
}
public boolean isStackFull(){
return (top == capacity- 1);
}
public void push(int data){
if(this.isStackFull())
this.doubleStack();
array[++top]= data;
}
private void doubleStack(){
int newArray[] = new int[capacity*2];
System.arraycopy(array, 0, newArray, 0, capacity);
capacity = capacity*2;
array = newArray;
}
public int pop() {
if(isEmpty()) System.out.println( "栈空");
else
return array[top--];
}
public void deleteStack(){
top = -1;
}
}
性能:
注意:倍增太多可能导致内存溢出
3.3基于链表的实现方法
public class LLStack{
private LLNode headNode;
public LStack(){
this.headNode = new LLNode(null);
}
public void Push(int data){
ifheadNode == null){
headNode = new LLNode(data);
}else if(headNode.getData() == null){
headNode.setData(data);
}else{
LLNode llNode = new LLNode(data);
llNode.setNext(headNode);
headNode = llNode;
}
}
public int top(){
if(headNode == null)
return null;
else
return headNode.getData());
}
public int pop(){
if(headNode == null){
throw new EmptyStackException("Stack empty");
}else{
int data = headNode.getData();,
headNode = headNode.getNext();
return data;
}
public boolean isEmpty0{
if(headNode == null)
return true;
else
return false;
}
public void deleteStack(){
headNode null;
}
}
性能: