单链表模拟栈的功能

183 阅读1分钟

单链表实现入栈、出栈功能

Stack.gif

代码如下

main函数,循环显示

public static void main(String[] args) {
        StackFun singleStack = new StackFun();
        String key = "";
        boolean flag = true;
        Scanner scanner = new Scanner(System.in);

        while(flag){
            System.out.println("s:show:显示栈");
            System.out.println("e:exit:退出程序");
            System.out.println("ph:push:入栈");
            System.out.println("pp:pop:出栈");
            System.out.println("请输入命令:");
            key = scanner.next();
            switch (key) {
                case "s":
                    singleStack.show();
                    break;
                case "e":
                    scanner.close();
                    flag = false;
                    break;
                case "ph":
                    System.out.println("请输入一个数:");    
                    SingleStack value = new SingleStack(scanner.nextInt());
                    singleStack.push(value);
                    break;
                case "pp":
                    try {
                        int res = singleStack.pop();
                        System.out.printf("出栈的数据是%d\n",res);
                    } catch (Exception e) {
                        //TODO: handle exception
                        System.out.println(e.getMessage());
                    }
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }

###栈方法类

class StackFun{
    SingleStack head = new SingleStack(0);
    //判断当前栈是否为空
    public boolean isEmpty(){
        return head.getNext() == null;
    }
    //显示栈情况
    public void show(){
        if(isEmpty()){
            System.out.println("栈空");
            return;
        }
        SingleStack temp = head.getNext();
        while(true){
            if(temp == null){
                break;
            }
            System.out.printf("Stack[%d]\n",temp.getData());
            temp = temp.getNext();
        }
    }
    //入栈
    public void push(SingleStack newstack){
        SingleStack temp = head;
        while(true){
            if(temp.getNext() == null){
                temp.setNext(newstack);
                break;
            }
            temp = temp.getNext();
        }
    }
    //出栈
    public int pop(){
        if(isEmpty()){
            throw new RuntimeException("栈空");//返回值为int,无法return,使用异常处理
        }
        SingleStack temp = head.getNext();
        int flag = 0;//存放要出栈节点的值
        while(true){
            if(temp.getNext() == null){//只有一个节点时
                flag = temp.getData();//先记录temp节点的值再断开连接,释放栈
                head.setNext(null);
                break;
            }
            if(temp.getNext().getNext() == null){//有多个节点
                flag = temp.getNext().getData();
                temp.setNext(null);
                break;
            }
            temp = temp.getNext();
        }
        return flag;
    }
}
class SingleStack{
    private int data;
    private SingleStack next;

    public SingleStack(int data) {
        this.data = data;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public SingleStack getNext() {
        return next;
    }
    public void setNext(SingleStack next) {
        this.next = next;
    }
    
}