概念
栈是一种只允许在一端进行插入或删除的线性表。
1、栈的操作端通常被称为栈顶,另一端被称为栈底。
2、栈的插入操作称为进栈(压栈|push);栈删除操作称为出栈(弹栈|pop)。
特点
栈就像一个杯子,我们只能从杯口放和取,所以栈中的元素是“先进后出”的特点。
存储结构
顺序存储的栈称为顺序栈;链式存储的栈称为链式栈。
java实现
我们可以围绕栈的4个元素来实现栈:
2状态:是否栈空;是否栈满。
2操作:压栈push;进栈pop。
链式栈的实现
链式栈示意图:
/**
* 栈: 不太需要头节点,只有头部进行操作
*/
public class StackLink {
private Node front; //指向堆栈底端的指针
private Node rear; //指向堆栈顶端的指针
private int length;
public int getLength() {
return length;
}
public StackLink() {
length = 0;
}
/**
* 判断第一个节点是否为空
* @return
*/
public boolean isEmpty(){
return front == null;
}
/**
* 栈的 压入, 尾部压入
* @param data
* @return
*/
public boolean push(int data){
Node newNode = new Node(data);
if (isEmpty()){
front = newNode;
rear = front;
length++;
}else {
rear.next = newNode;
rear = newNode;
length++;
}
return true;
}
/**
* 头部压入
* @param data
* @return
*/
public boolean push_head(int data){
Node newNode = new Node(data);
if (isEmpty()){
front = newNode;
rear = front;
length++;
}else {
newNode.next = front;
front = newNode;
length++;
}
return true;
}
/**
* 出栈:获取头部数据,并且删除节点
* @return
*/
public int pop(){
if (isEmpty())
throw new NullPointerException("栈为空");
Node curNode = front;
int data;
if (front == rear){ //只有一个节点的情况
data = rear.data;
front = null;
rear = null;
}else {
while (curNode.next != rear)
curNode = curNode.next;
data = rear.data;
curNode.next = rear.next; //删除节点为空
rear = curNode;
}
return data;
}
/**
* 查看栈顶元素
* @return
*/
public int peek(){
if (isEmpty())
throw new NullPointerException("栈为空");
return rear.data;
}
/**
* 返回与栈顶的距离
* @return
*/
public int search(int data){
if (isEmpty())
throw new NullPointerException("栈为空");
int index = 0;
Node curNode = front;
while (curNode != null){
if (curNode.data == data)
break;
index++;
curNode = curNode.next;
}
return length-index;
}
public static void main(String[] args) {
StackLink stackLink = new StackLink();
stackLink.push(1);
stackLink.push(2);
stackLink.push(3);
System.out.println(stackLink.search(1));
System.out.println(stackLink.pop());
System.out.println(stackLink.peek());
}
}