数据结构——栈(Stack)
程序员文章站
2022-06-07 09:58:38
...
一、栈的定义
栈是限定仅在表尾进行插入和删除操作的线性表.
二、 栈的特点
栈也是一种线性结构;
相比数组,栈所对应的操作是数组的子集;
栈只能从一端添加元素,也只能从这一端取出元素,这一端通常称之为"栈顶";
向栈中添加元素的过程,称之为"入栈",从栈中取出元素的过程称之为"出栈";
栈的描述如下图:
三、栈的实现
1、首先,定义一个接口包含栈的方法
public interface Stack <E> extends Iterable<E>{
//获取有效个数
int getSize();
//判断空栈
boolean isEmpty();
//进栈
void push();
//弹栈
E pop();
//获取栈顶元素
E peek();
//清空栈
void clear();
}
2、然后实现一个ArrayStack类
- 创建一个栈
public class ArrayStack<E> implements Stack<E> {
private ArrayList<E> list;
//创建一个默认大小的栈
public ArrayStack(){
list=new ArrayList<>();
}
//创建一个指定大小的栈
public ArrayStack(int capacity){
list=new ArrayList<>(capacity);
}
}
- 获取有效元素个数和判空
//获取有效元素个数
@Override
public int getSize() {
return list.getSize();
}
//判空
@Override
public boolean isEmpty() {
return list.isEmpty();
}
- 入栈
//入栈
@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 void clear() {
list.clear();
}
- 实现自定义打印数组格式
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append(String.format("ArrayStack: %d/%d\n",getSize(),list.getCapacity()));
sb.append('[');
if(isEmpty()){
sb.append(']');
}else{
for(int i=0;i<getSize();i++){
sb.append(list.get(i));
if(i==getSize()-1){
sb.append(']');
}else{
sb.append(',');
}
}
}
return sb.toString();
}