head:指向头结点,不存放数据。当 head = top 时表示栈无数据。
top:指针,向栈中加入数据时,指向该数据。
向栈中加入数据时,top.next指向该数据,该数据的pre指向top,最后top再向后移。
向栈中取出数据时,取出top指向的数据,top.pre.nex指向空,最后top通过pre再向前移。
遍历栈时,类似于向栈中取出数据,可以设置一个临时变量指向top,然后top通过pre依次取出数据,最后top再指向临时变量,不改变链表的结构和top指向。
最后,如果是单链表可以采取头插入的方式。
完整代码如下:public class ListStackDemo {
public static void main(String[] args) {
ListStack stack = new ListStack();
//接收用户输入
String key = " ";
boolean loop = true;
Scanner in = new Scanner(System.in);
while (loop){
System.out.println("show:显示栈");
System.out.println("push:添加数据");
System.out.println("pop:取出数据");
System.out.println("exit:退出");
System.out.print("请输入你的选择:");
key = in.next();
switch (key){
case "show":
stack.list();
break;
case "push":
System.out.print("请输入一个数:");
int value = in.nextInt();
stack.push(new Num(value));
System.out.println("添加成功");
break;
case "pop":
stack.pop();
break;
case "exit":
in.close();
loop = false;
break;
}
}
System.out.println("退出程序");
}
}
class ListStack {
private Num head = new Num(0);
//表示栈顶
private Num top = head;
public Num getHead() {
return head;
}
//加入数据
public void push(Num num) {
//将num加入到链表最后一个位置
top.next = num;
num.pre = top;
//top 指向num
top = num;
}
//取出数据
public void pop(){
//表示链表无num
if (top == head){
System.out.println("没有num可以出栈");
return;
}
//通过pre反向出栈
System.out.println("出栈" + top);
//将top的next置空
top.pre.next = null;
top = top.pre;
}
public void list(){
//表示链表无num
if (top == head){
System.out.println("栈空");
return;
}
//临时变量,保存top指针
Num temp = top;
//遍历
while (top != head){
System.out.println("列表的元素有:" + top);
top = top.pre;
}
top = temp;
}
}
class Num {
// public 方便获取数据
public int no;
//下一个
public Num next;
//上一个
public Num pre;
public Num(int no) {
this.no = no;
}
@Override
public String toString() {
return "Num{" +
"no=" + no + '}';
}
}
还在学习中,有问题辛苦指出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)