栈的介绍
栈的实现思路
用双向链表来实现栈
1.push压栈就是顺序添加 先找到要添加位置的前一个位置,让前一个位置的节点 cur.next=newNode newNode.pre=cur newNode.next不用管 next没有初始化默认为null
2.pop出栈 先找到最后一个节点 让其自我删除 双向链表可以自我删除 不用找到要删除位置的前一个节点
3.显示 比较容易见代码
代码实现
package 栈;
/**
* @author 一介草莽子
* version 1.0
*/
@SuppressWarnings({
"all"})
public class LinkedStackDemo {
public static void main(String[] args) {
LinkedStack linkedStack = new LinkedStack();
linkedStack.push(new Node(1));
linkedStack.push(new Node(2));
linkedStack.push(new Node(3));
linkedStack.push(new Node(4));
linkedStack.pop();
linkedStack.pop();
linkedStack.pop();
linkedStack.pop();
linkedStack.push(new Node(3));
linkedStack.push(new Node(4));
linkedStack.Show();
System.out.println("栈顶指针 "+linkedStack.top);
}
}
class LinkedStack {
/**
* 1,显示栈 2,push压栈 3 pop弹栈
*/
//头结点 不存任何东西
Node first = new Node(0);
//链表的长度 也代表栈顶
int top = 0;
//添加元素 push压栈
/**
* 思路:找到要添加位置的前一个位置 让 newNode.next=cur.next cur.next=newNode
*
* @param newNode
*/
public void push(Node newNode) {
Node cur = first;
while (true) {
if (cur.next == null) {
break;//找的了最后一个
}
cur = cur.next;//遍历
}
//前面的next指向后面的新节点
cur.next = newNode;
//新节点指向旧节点
newNode.pre = cur;
System.out.println("添加成功");
top++;
}
//pop弹栈 删除元素 要从栈顶先删除数据
/**
* 找的最后一个节点自我删除 cur.pre.next=null cur.pre=null;
* @param
*/
public void pop() {
Node cur=first;
if(first.next==null){
System.out.println("栈空了...");
return;
}
//找最后一个节点
while(true){
if(cur.next==null){
break;//找到了最后一个节点
}
cur=cur.next;
}
//删除最后这个元素
cur.pre.next=null;//让找的这个节点的前一个节点的next置空
cur.pre=null;//?这个操作有必要吗
top--;
System.out.println("删除成功...");
}
//显示链表
public void Show(){
Node cur=first;
if(first.next==null){
System.out.println("空栈....");
return;
}
while (true){
if(cur.next==null){
break;
}
System.out.println(cur.next.toString());
cur=cur.next;
}
}
}
class Node {
public int num;
public Node next;//指向下一个节点
public Node pre;
//构造器为num赋值
public Node(int num) {
this.num = num;
}
@Override
public String toString() {
return "Node{" +
"num=" + num +
'}';
}
}