【数据结构】顺序栈的原理及实现
1.什么是栈
- 栈它是一种先进后出的有序列表数据结构。
- 栈是线性表里的元素插入和删除只能在该线性表的同一端进行的一种特殊线性表。
- 该线性表的插入和删除都叫栈顶,也就是变化的一端。另一端是固定不变的成为栈底。
- 根据下图可以看出,最先放入栈的元素是在栈底的,最后放入的元素是在栈顶的。
- 删除元素的话是最后放入的元素最先被删除掉,最先放入的元素最后被删除。
2.顺序栈的功能实现
初始化栈 | public ListStack(int maxSize) |
---|---|
判断是否栈空 | public boolean isEmpty() |
判断是否栈满 | public boolean isFull() |
入栈 | public void push(T data) |
出栈 | public int pop() |
返回栈顶元素 | public int peekStack() |
遍历栈内所有元素 | public void show() |
(1)初始化栈
(2)判断当前栈是否已满
(3)判断当前栈是否为空
(4)遍历栈内所有元素
(5)元素压栈操作
(6)元素出栈操作
3.顺序栈功能测试
(1)整体代码实现
public class ListStack<T> {
/**
* 定义最大的长度
*/
private final int maxSize;
/**
* 定义栈顶下标
*/
private int top = 0;
/**
* 定义数组
*/
private final T[] stack;
/**
* 定义默认的长度
*/
private final static int DEFAULT_SIZE = 10;
/**
* 有参构造方法,自定义栈的大小
* @param maxSize
*/
public ListStack(int maxSize){
this.maxSize = maxSize;
stack = (T[]) new Object[maxSize];
}
/**
* 判断栈是否是满的
* @return
*/
public boolean isFull(){
return top == maxSize;
}
/**
* 判断栈是否为空
* @return
*/
public boolean isEmpty(){
return top == 0;
}
/**
* 元素入栈
* @param data
*/
public void push(T data){
if(isFull()){
throw new RuntimeException("当前栈空间已满");
}
//数据入栈操作
stack[top] = data;
top++;
}
/**
* 元素出栈
* @return
*/
public T pop(){
if(isEmpty()){
throw new RuntimeException("当前栈空间为空,无法出栈");
}
//先进行--操作,在弹出--后的下标的数据
return stack[--top];
}
/**
* 遍历栈的数据
*/
public void show(){
for(int i=0;i<top;i++){
System.out.print(stack[i]+" ");
}
System.out.println();
}
/**
* 返回栈顶元素
* @return
*/
public T peekStack(){
return stack[top-1];
}
public static void main(String[] args) {
ListStack<Integer> listStack = new ListStack<>(5);
System.out.println("判断栈是否为空:"+listStack.isEmpty());
System.out.println("判断栈是否已满:"+listStack.isFull());
System.out.println("向栈中添加元素: 1 2 3");
listStack.push(1);
listStack.push(2);
listStack.push(3);
System.out.println("输出当前栈中的元素:");
listStack.show();
System.out.println("前栈弹出 一个 元素");
listStack.pop();
System.out.println("输出当前栈中的元素:");
listStack.show();
System.out.println("栈顶元素为:"+listStack.peekStack());
}
}
(2)测试代码
4.栈的优缺点
- 优点:在输入的数据量在可以预知的情况下,可以使用数组来实现栈,并且的话数据的实现栈效率会更高,因为出栈和入栈的操作都在数组的末尾来进行操作。
- 缺点:对数组的大小创建不当的话,可能会出现栈溢出。