1.首先我们知道在浏览器中有一个前进和倒退的功能,那么这个功能具体的实现算法,其实就是栈,这样一来,大家应该也知道了栈的算法特点了,没错,就是先进后出,后进先出。
2.对于栈的代码实现,方法无非就三种peek()获取栈顶元素、pop()移除栈顶元素、push()往栈顶添加元素,这样一来大家应该可以看出来了,栈顶就是栈的进行特色,那么我们直接看代码是如何实现的吧。
(1).我们首先使用数组实现栈,代码如下:
package com.example.main;
public class Stack {
//必须声明栈的大小
int size;
//创建数组
String[] stack;
//再创建一个栈顶,没有元素时默认栈顶为-1.
int top = -1;
public Stack(){
InitDate(20);
}
public Stack(int size){
InitDate(size);
}
//可以让调用者往构造函数里面传入栈的大小参数。
public void InitDate(int size){
this.stack = new String[size];
this.size = size;
}
//往栈中添加元素的push()方法。
public Boolean push(String value){
if (this.top > this.size - 1) {
return false;
}
this.top++;
this.stack[this.top] = value;
return true;
}
//获取栈顶元素
public String peek(){
return this.stack[this.top];
}
//获取并删除栈顶元素
public String pop(){
String element = this.stack[this.top];
this.stack[this.top] = null;
this.size--;
this.top--;
return element;
}
}
(2).那么我们还想再用链表来实现栈的结构,因为链表本身就具有无限扩充的能力,不必要计较容量是否充足。代码也是如下:
这个是创建的链表Node类。
package com.example.main;
public class Node<T> {
private T content;
private Node<T> next;
public Node(T content) {
this.content = content;
}
public Node(T content, Node<T> next) {
this.content = content;
this.next = next;
}
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
}
以下才是栈的实现:
package com.example.main;
public class Stack<T> {
Node<T> stack;
private int size = 0;
//可以得到栈的大小。
public int getSize(){
return this.size;
}
public void push(T value){
if (this.size == 0){
this.stack = new Node<>(value,null);
} else {
this.stack = new Node<>(value,this.stack);
}
this.size++;
}
public T peek(){
if (this.size == 0){
return null;
}
return this.stack.getContent();
}
//在pop()方法中不需要使node的content为null,因为Java的垃圾回收机制会帮你解决掉。
public T pop(){
if (this.size == 0){
return null;
}
Node<T> node = this.stack;
this.stack = this.stack.getNext();
node.setNext(null);
return node.getContent();
}
}
3.那么我们手搓完栈之后,在JDK里面已经帮我们封装好了一个栈类了,即如下所示: