Java数据结构与算法(用单向链表来实现栈)

package stack;
import java.util.Scanner;

/**
 * @author 万葛亮
 * @Date 2020 07 07 11:42
 */


//使用链表模拟栈
public class LinkedToStack {
    public static void main(String[] args) {
        //测试类
        Stack2 stack = new Stack2();
        String key = "";
        boolean loop = true; //控制是否退出菜单
        Scanner scanner = new Scanner(System.in);

        while (loop) {
            System.out.println("show: 表示显示栈");
            System.out.println("exit: 退出程序");
            System.out.println("push: 表示添加数据到栈(入栈)");
            System.out.println("pop: 表示从栈取出数据(出栈)");
            System.out.println("请输入你的选择");
            key = scanner.next();
            switch (key) {
                case "s":
                    stack.list();
                    break;
                case "push":
                    System.out.println("请输入一个数");
                    int value = scanner.nextInt();
                    stack.push(value);
                    break;
                case "pop":
                    try {
                        int res = stack.pop();
                        System.out.printf("出栈的数据是 %d\n", res);
                    } catch (Exception e) {
                        // TODO: handle exception
                        System.out.println(e.getMessage());
                    }
                    break;
                case "e":
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }

        System.out.println("程序退出~~~");
    }
}


class Stack2 {
    //链表实现不需要考虑是否为满的情况,因为是链式的,根据计算机空间而定

    //定义一个头节点
    Node head = new Node(0);

    //临时变量,保存头节点
    Node temp = head;

    //判断是否为空
    public boolean isEmpty() {
        return head.next == null;
    }

    //进栈
    public void push(int value) {
        Node node = new Node(value);
        temp.next = node;
        temp = temp.next;
    }

    //出栈
    public int pop() {
        if (isEmpty()) {
            System.out.println("栈为空");
            return -1;
        }
        Node pre = head;
        while (true) {
            if (pre.next == temp) {
                break;
            }
            pre = pre.next;
        }
        pre.next = temp.next;//temp.next=null,将pre至于链表的最后
        int value = temp.no;
        temp = pre;//再将pre指向最后(temp)
        return value;
    }

    //遍历栈
    public void list() {
        temp = head;
        if (isEmpty()) {
            System.out.println("栈空");
            return;
        }
        while (true) {
            if (temp.next == null) {
                break;
            }
            System.out.println(temp.next.no);
            temp = temp.next;
        }

    }
}

//在这个类里面定义节点
class Node {
    int no;
    Node next;

    public Node(int no) {
        this.no = no;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值