大家好我是苏麟 , 今天聊聊.
本期大纲
- 栈的基础知识
- 栈的特征
- 栈的操作
- Java中的栈
- 基于链表实现栈
栈的基础知识
栈的特征
栈和队列是比较特殊的线性表,又称之为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现。理论上递归能做的题目栈都可以,只是有些问题用栈会非常复杂。
栈底层实现仍然是链表或者顺序表,栈与线性表的最大区别是数据的存取的操作被限制了,其插入和删除操作只允许在线性表的一端进行。
更好的理解栈 :
我们需要先举一个生活中的例子。栈就好比一个长的圆筒,圆筒一端封闭,另一端开口。往圆筒里放入乒乓球,先放入的靠近圆筒底部,后放入的靠近圆筒入口。
那么,要想取出这些乒乓球,则只能按照和放入顺序相反的顺序来取,先取出
后放入的,再取出先放入的,而不可能把最里面最先放入的乒乓球优先取出。
栈中的元素只能先入后出(First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶(top).
栈的操作
入栈(压栈)
入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元
素的位置将会成为新的栈顶。
出栈(弹栈)
出栈操作(pop)就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素
的前一个元素将会成为新的栈顶。
Java中的栈
栈的常用方法主要有 :
- push(E):增加一个元素E
- pop0:弹出元素E
- peek0:显示栈顶元素,但是不出栈
- empty0:判断栈是否为空
我们在设计自己的栈的时候,不管用数组还是链表,都要实现上面几个方法
java的util中就提供了栈Stack类,使用不复杂,看一个例子就够了 .
public static void main(String[] args) {
Stack theStack = new Stack();
theStack.push(10);
theStack.push(20);
theStack.push(30);
theStack.push(40);
theStack.push(50);
while (!theStack.isEmpty()) {
long value = theStack.pop();
System.out.print(value);
System.out.print(" ");
}
System.out.println("");
}
基于链表实现栈
链表也可以实现栈,插入和删除都在头结点进行就可以了
简单的写了一下 , 大家可以根据自己的想法和业务逻辑自己编写
代码 :
package src.sl.stack;
public class MyStack {
private static Node head = new Node(-100, null);
/**
* 节点
*/
private static class Node {
Integer val;
Node next;
public Node(Integer val, Node node) {
this.val = val;
this.next = node;
}
}
/**
* 压栈
* @param value
*/
public void push(Integer value) {
//创建节点
Node node = new Node(value, null);
node.next = head.next;
head.next = node;
}
/**
* 判断是否为空
* @return
*/
public boolean empty(){
if (head.next == null){
return true;
}
return false;
}
/**
* 返回当前元素的值
* @return
*/
public Integer peek(){
if (head.next == null){
return null;
}
return head.next.val;
}
/**
* 删除栈顶元素 返回值
* @return
*/
public Integer pop(){
boolean flag = empty();
if (flag){
return null;
}
int val = head.next.val;
head.next = head.next.next;
return val;
}
}
测试 :
package src.sl.stack;
public class MyStackTest {
public static void main(String[] args) {
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
while (!myStack.empty()){
int peek = myStack.peek();
System.out.println(peek);
int pop = myStack.pop();
System.out.println(pop);
}
}
}
这关就到这里 , 下一关见!