3.1栈
3.1.1栈的定义及基本运算
栈是限定仅在表尾进行插入和删除操作的线性表.允许插入,删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈.
栈的修改是按后进先出的原则进行的,因此栈又称为后进先出的线性表(LIFO,last in first out)
入栈和出栈的是栈的两个主要操作,每一次进栈的元素总是称为当前的栈顶元素,而每一次出栈的元素总是当前的栈顶元素.所以栈顶的位置随元素的插入和删除而变化.所以需要一个称为栈顶指针的位置指示器来表示栈顶的当前位置.
栈的基本操作
(1)初始化:构造一个空的栈
(2)入栈:在栈顶位置插入一个新元素
(3)出栈:删除栈顶元素
(4)获取:去栈顶数据元素
(5)判空:判断当前栈是否为空
(6)求长度:求出栈中数据元素的个数
(7)正序遍历:依次访问栈中每个元素并输出
(8)销毁:销毁一个已存在的栈
3.1.3顺序栈
顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,把数组中下标为0的一端作为栈底,为了只是栈中元素的位置,我们定义变量top来指示栈顶元素在顺序栈中的位置,top为整型.顺序栈泛型类定义如下:
public class sequenceStack {
final int MaxSize=10;
private T[] stackArray;
private int top;
public sequenceStack(){}
public sequenceStack(int n){}
//在栈顶插入一个新元素
public void push(T obj){}
//删除栈顶元素
public T pop(){}
//取出栈顶数据元素
public T getHead(){}
//判断当前栈是否为空
public boolean isEmpty(){}
//求出栈中数据元素的个数
public int size(){}
//依次访问栈中每个元素并输出
public void nextOrder(){}
//销毁一个已存在的栈
public void clear(){}
}
1.top为指针,top指向栈顶元素的位置
top的初始值为-1,指向栈底,而这个top==-1也可作为栈空的标志,每当插入一个新的栈顶元素时,先把栈顶指针top增加1,再把入栈的元素放到top指针指向的位置。
删除栈顶元素时,先删除栈顶,再将栈顶指针top减去1。
非空栈中的栈顶指针top始终在栈顶元素的位置上。
2.顺序栈的基本操作
以top为指针,top指向栈顶元素为例来实现顺序栈的基本操作
栈的初始化
public class sequenceStack {
final int MaxSize=10;
private T[] stackArray;
private int top;
public sequenceStack(){
top=-1;
stackArray=(T[])new Object[MaxSize];
}
public sequenceStack(int n){
if (n<=0){
System.out.println("array length must large than 0");
System.exit(-1);
}
top=-1;
stackArray=(T[])new Object[n];
}
入栈
入栈时,首先应该判断栈是否满了,栈满时,不能入栈,否则出现空间溢出,引起错误,这种现象称为上溢。
public void push(T obj){
if (top==stackArray.length-1){
T []p=(T[])new Object[top*2+2];
for(int i=0;i<top+1;top++)
p[i]=stackArray[i];
stackArray=p;
}
top++;
stackArray[top]=obj;
}
出栈
出栈时,需要先判断栈是否为空,为空时不能出栈,否则会产生错误。
//删除栈顶元素
public T pop(){
if(top==-1){
System.out.println("stack is empty!");
return null;
}
top=top-1;
return stackArray[top+1];
}
取出栈顶元素
读栈时,需要先判度栈是否为空,为空时,不能操作,否则产生错误。
//取出栈顶数据元素
public T getHead(){
if(top==-1){
System.out.println("the stack is empty!");
return null;
}
return stackArray[top];
}
判断栈空操作
//判断当前栈是否为空
public boolean isEmpty(){
return top==-1;
}
求栈的长度
//求出栈中数据元素的个数
public int size(){
return stackArray.length;
}
遍历栈
//依次访问栈中每个元素并输出
public void nextOrder(){
if (isEmpty()){
System.out.println("the stack is empty!");
}
for (int i=top;i>-1;i--)
p=stackArray[i];
System.out.println(p);
}
清空栈
//销毁一个已存在的栈
public void clear(){
top=-1;
}