一、顺序栈
- 栈是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底(push),最后的数据在栈顶(top),需要读数据的时候从栈顶开始弹出数据(top)最后一个数据被第一个读出来。
- 顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用光而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用;
顺序栈:利用一组地址连续的存储单元依次存放栈底到栈顶的数据元素,栈底位置不变,栈顶位置随着入栈和出栈操作而发生变化;
图中的top即栈顶指针,永远指向下一个可以存放数据元素的位置,入栈和出栈都是对栈顶进行操作;
二、实现一个简单的顺序栈及基本操作
- (泛型)顺序栈的数据结构:
class SqStack<T> {
private int top; //栈定指针
private T[] elem; //存储结构 数组
public SqStack() { //顺序栈构造函数
this(10);
}
public SqStack(int size) { //顺序栈构造函数 初始化数组
this.top = 0;
this.elem = (T[])new Object[size];
}
}
- 常用操作
- 判满
//判满
public boolean isFull() {
return this.top == this.elem.length;
}
- 判空
//判空
public boolean isEmpty() {
return this.top == 0;
}
- 扩容
//扩容
public void grow() {
//此处采用1.5倍扩容
int newLength = this.elem.length + (this.elem.length>>1);
this.elem = Arrays.copyOf(this.elem, newLength);
}
- 入栈
//入栈
public void push(T value) {
if (isFull()) { //栈满则进行扩容操作
grow();
}
this.elem[this.top++] = value;
}
- 出栈
出栈操作可以直接令top -= 1,即指向下一个元素;
//出栈
public T pop() { //此处将出栈的元素返回
if (isEmpty()) {
System.out.println("空栈");
}
return this.elem[--this.top];
}
- 得到栈顶元素
//得到栈顶元素
public T getTop() {
if (isEmpty()) {
return null;
}
return this.elem[this.top-1];
}
- 打印
//打印栈内元素
public void show() {
for (int i = 0;i < this.top;i++) {
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
}