链式栈--------Java实现
程序员文章站
2022-06-05 14:49:28
...
链式栈示意图
Java代码实现
/**
* @author mwl
* @date 2018年4月27日
* @version 1.0.0
*/
public class LinkStack {
/**
* 定义链栈的结点
* Object类型的数据域
* Node类型的指针域
* @author MWL
*/
private class Node{
Object data;
Node next;
public Node(){}
public Node(Object data,Node next){
this.data = data;
this.next = next;
}
}
private Node top; //栈顶元素
private int size; //当前栈的大小
/**
* 创建空链栈
*/
public LinkStack() {
top = null;
}
/**
* 以data数据元素创建链式栈
* @param data
*/
public LinkStack(Object data){
top = new Node(data,null);
size++;
}
/**
* 判断链栈是否为空栈
* @return
*/
public boolean isEmpty(){
return size == 0 ? true : false;
}
/**
* 返回链栈的长度
* @return
*/
public int length(){
return size;
}
/**
* 压栈(入栈)
* @param data
*/
public void push(Object data){
//更新头节点
// System.out.print("压栈成功:" + data + "指向->" + top + "\t");
// 让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
top = new Node(data, top);
size++;
}
/**
* 出栈
* @return
*/
public Object pop(){
if(isEmpty()) {
System.out.println("目前是空栈,无法进行出栈!");
return "error!";
}
Node temp = top;
// 更新头结点
top = top.next;
// 释放原栈顶元素的next引用,删除指针指向
temp.next = null;
size--;
return temp.data;
}
/**
* 访问栈顶元素
* @return
*/
public Object peek(){
if(top != null){
return top.data;
}
return "空栈,无栈顶元素!";
}
/**
* 遍历栈并打印栈内元素
*/
public void displayStack(){
while(top != null){
System.out.println(top.data + "\t");
top=top.next;
}
}
/**
* 清空栈
*/
public void clear(){
top = null;
size = 0;
}
public static void main(String[] args) {
LinkStack stack = new LinkStack("how");
stack.push(3);
stack.push("hello");
stack.push('A');
// stack.displayStack();
System.out.println("++++++++++++");
System.out.println("当前栈的长度为:" + stack.length());
System.out.println("当前栈是否为空:" + stack.isEmpty());
System.out.println("当前栈的栈顶元素为:" + stack.peek());
System.out.println("第一次出栈时的栈顶元素:" + stack.pop());
System.out.println("============");
System.out.println("出栈后的栈顶元素:" + stack.peek());
System.out.println("第二次出栈时的栈顶元素:" + stack.pop());
System.out.println("第三次出栈时的栈顶元素:" + stack.pop());
System.out.println("第四次出栈时的栈顶元素:" + stack.pop());
System.out.println("************");
}
}
程序运行结果如下:
++++++++++++
当前栈的长度为:4
当前栈是否为空:false
当前栈的栈顶元素为:A
第一次出栈时的栈顶元素:A
============
出栈后的栈顶元素:hello
第二次出栈时的栈顶元素:hello
第三次出栈时的栈顶元素:3
第四次出栈时的栈顶元素:how
************
注意:在以上代码中,如果在出栈前就已经对链栈中的栈内元素进行打印输出,那么在执行出栈操作的时候会产生空指针异常,因为在进行打印镇内元素时,栈顶指针发生了变化,整个栈内元素打印完毕,top指针为空,此时在进行出栈时,便会产生空指针异常问题。