1.栈:
-栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。
-这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
-从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2.栈的模型:
3.基本算法:
1.栈是否为空
2.获取栈顶元素
3.进栈
4.出栈
5.获取有效长度
6.清空栈
7.重写toString方法
4.实现方式:
一,顺序栈(动态数组)
外层使用列表实现,内层使用数组实现。
-
进栈
进入栈的元素从栈顶进入。即在列表的末尾增加元素。
-
出栈
弹栈的元素从栈顶弹出。即在列表末尾删除元素。
-
获取栈顶元素
获取列表末尾的元素。
-
栈是否为空
判断列表是否为空。
-
获取有效元素
获取列表的有效长度。
-
清空栈
清空列表。
-
获取栈的容量
获取列表的
-
重写toString方法
重新拼接字符串。
代码:
package p01.动态数组;
public class ArrayStack<E> implements Stack<E> {
private ArrayList<E> list;
public ArrayStack(){ //创建一个默认容量为10的栈
this(10);
}
public ArrayStack(int capacity){//创建一个指定容量为capcacity的栈
list=new ArrayList<>(capacity);
}
@Override
public void push(E e) { //进栈
list.addLast(e);
}
@Override
public E pop() { //出栈
return list.removeLast();
}
@Override
public E peek() { //获取栈顶元素
return list.getLast();
}
@Override
public boolean isEmpty() { //栈是否为空
return list.isEmpty();
}
@Override
public int getSize() { //获取有效元素
return list.getSize();
}
@Override
public void clear() { //清空栈
list.clear();
}
public int getCapacity(){ //获取栈容量
return list.getCapacity();
}
@Override
public String toString() { //重写toString方法
StringBuilder sb=new StringBuilder();
if(isEmpty()){
sb.append(String.format("ArrayStack:bottom[]top %d/%d", getSize(),getCapacity()));
}else{
sb.append("ArrayStack:bottom[");
for(int i=0;i<list.getSize();i++){
if(i==list.getSize()-1){
sb.append( list.get(i)+"]top");
}else{
sb.append(list.get(i)+",");
}
}
sb.append(String.format(" %d/%d \n", getSize(),getCapacity()));
}
return sb.toString();
}
}
二,链表栈(动态链表)
使用链表列表实现。
-
进栈
进入栈的元素从栈顶进入。即在链表列表的末尾增加元素。
-
出栈
弹栈的元素从栈顶弹出。即在链表列表末尾删除元素。
-
获取栈顶元素
获取链表列表末尾的元素。
-
栈是否为空
判断链表列表是否为空。
-
获取有效元素
获取链表列表的有效长度。
-
清空栈
清空链表列表。
-
获取栈的容量
获取链表列表的
-
重写toString方法
重新拼接字符串。
代码:
package p02.动态链表;
import p01.动态数组.Stack;
public class LinkedStack<E> implements Stack<E> {
private LinkedList<E> list; //底层使用链表列表实现
public LinkedStack(){
list=new LinkedList<>();
}
@Override
public void push(E e) { //进栈
list.addFirst(e);
}
@Override
public E pop() { //出栈
return list.removeFirst();
}
@Override
public E peek() { //获取栈顶元素
return list.getFirst();
}
@Override
public boolean isEmpty() { //栈是否为空
return list.isEmpty();
}
@Override
public int getSize() { //栈的有效长度
return list.getSize();
}
@Override
public void clear() { //清空栈
list.clear();
}
}
5.双端栈
是指从一个线性表的两端当做栈底进行分贝的入栈和出栈操作。
实现方式:
数组实现