栈的定义
栈是一种只能在一端进行插入或删除操作的线性表。其中允许进行插入或删除操作的一段叫栈顶。栈顶由一个称为栈顶指针的位置的位置指数器(其实就是一个变量,对于顺序栈,就是记录栈顶元素所在数组位置标号的一个整形变量;对于链式栈,就是记录栈顶元素所在结点地址的指针)来指示,它是动态变化的。栈的另一端成为栈底,栈底一般是固定不变的。栈的插入和删除操作一般称为入栈和出栈。
栈的特点
栈的主要特点是先进后出,栈中的元素就好比开进一个死胡同的车队,最先开进去的汽车只能等后进来的汽车都出去之后才能出去。
栈的存储结构
可以用顺序表和链式表来存储栈,栈可以依照存储结构分为两种:顺序栈和链式栈。在栈的定义中已经说明,栈是一种在操作上稍加限制的线性表,即本质上是线性表,而线性表有两种存储结构:顺序表和链表,因此栈同样有两种结构。
今天我们看一下顺序栈:顺序栈是利用一组地址连续的存储单元依次存放从栈底到栈顶的数据元素,栈底位置固定不变,它的栈顶元素可以直接通过顺序栈底层数组的数组元素arr[size - 1]来访问。
下面是代码:
package stack;
public class Sequencestack {
private int STACK_INIT_SIZE = 5;//栈的原始大小
private int INCREMENT =1;//栈的增量大小
private Object []Stack = null;
private int base;
private int top;
private int stacksize;
/**
* 初始化栈
* */
void initStack() {
Stack = new Object[STACK_INIT_SIZE];
base=0;
top=0;
stacksize=0;
}
/**
* 入栈
* */
void push(Object o){
if(top-base>=STACK_INIT_SIZE){
System.out.println("扩充栈");
STACK_INIT_SIZE=STACK_INIT_SIZE+INCREMENT;
Object []temp = new Object[STACK_INIT_SIZE];
for(int i=0;i<stacksize;i++){
temp[i]=Stack[i];
}
Stack=null;
Stack=temp;
}
Stack[stacksize] = o;
stacksize++;
top++;
}
/**
* 出栈
* */
Object pop(){
Object o = null;
if(top==base){
System.out.println("栈中没有元素!返回null");
}else{
o=Stack[--top];
stacksize--;
}
return o;
}
/**
* 取栈顶元素
* */
Object getTop(){
Object o = null;
if(top==base){
System.out.println("栈中没有元素!返回null");
}else{
o=Stack[top-1];
}
return o;
}
/**
* 打印栈
* */
void print(){
System.out.print("打印栈:");
for(int i=0;i<stacksize;i++){
System.out.print(Stack[i]+"\t");
}
System.out.println();
}
}
测试类:
package stack;
public class SequenceStackMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Sequencestack sStack = new Sequencestack();
sStack.initStack();
sStack.pop();
sStack.push(1);
sStack.push(2);
sStack.push(3);
sStack.push(4);
sStack.push(5);
sStack.push(6);
sStack.push(3);
sStack.print();
sStack.pop();
sStack.pop();
sStack.pop();
sStack.pop();
sStack.print();
System.out.println("取栈顶元素:"+sStack.getTop());
sStack.print();
}
}
测试结果:
栈中没有元素!返回null
扩充栈
扩充栈
打印栈:1 2 3 4 5 6 3
打印栈:1 2 3
取栈顶元素:3
打印栈:1 2 3