1.栈的基础知识
1.1栈的特征
允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Botton),同时插入元素的操纵称为入栈(Push),删除元素的操作称为出栈(Pop),栈内无元素称为空栈
1.2栈的操作
push(E):增加一个元素E
pop():弹出栈顶元素
peek():显示栈顶元素,但不出栈
empty():判断栈是否为空
入栈顺序为1234,出栈顺序可能是什么?
1.3java中的栈
public class UseStack {
public static void main(String[] args) {
//新建一个Stack对象
Stack<Integer> stack = new Stack();
//入栈操作
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
//显示栈顶元素
System.out.println("栈顶元素为:" + stack.peek());
//出栈
Integer popObj = stack.pop();
System.out.println("出栈的元素是:" + popObj);
}
}
2.基于数组实现栈
注意:自处top指向栈顶空位置
数组和链表的不同之处:以数组结构实现的栈,在push()时要考虑空间是否需要扩容
public class ArrayImpStack<T> {
//定义一个实现栈的数组
Object[] stack;
//定义指向栈顶空位置的指针
int top;
//初始化栈
ArrayImpStack(){
stack = new Object[10];
top=0;
}
//判断栈是否为空
boolean empty(){
return top == 0;
}
//添加元素
public void push(T t){
//是否要扩容
expandCapacity(top+1);
stack[top] = t;
top++;
}
//显示栈顶元素
public T peek(){
T t =null;
//栈不为空
if (top>0){
t = (T)stack[top -1];
}
return t;
}
//出栈
public T pop(){
//显示要出栈的元素
T t =peek();
if (top>0){
//要出栈的元素 赋值 null,top指针下移
stack[top-1] = null;
top--;
}
return t;
}
//扩容 判断size和数组的长度来决定是否扩容
public void expandCapacity(int size){
int length = stack.length;
if (size > length){
size = size*3/2 + 1 ;//每次扩容50%
stack = Arrays.copyOf(stack,size);
}
}
}
3.基于链表实现栈
public class LinkedImpStack<T> {
//定义 链表栈 中的 节点
class LinkNode<T>{
T t;
LinkNode next;
}
LinkNode<T> head;
//初始化栈
LinkedImpStack(){
head=null;
}
//入栈
public void push(T t){
if (t == null){
throw new NullPointerException("参数不能为空");
}
if (head == null){
head = new LinkNode<T>();
head.t = t;
head.next = null ;
}else {
LinkNode<T> temp =head;
head = new LinkNode<>();
head.t = t;
head.next = temp;
}
}
//出栈
public T pop(){
if (head == null){
return null;
}else {
T t = head.t;
head = head.next;
return t;
}
}
//判断栈是否为空
public boolean empty(){
return head == null ;
}
//取栈顶元素
public T peek(){
if (head == null){
return null;
}else{
T t = head.t;
return t;
}
}
}