题解 | #【模板】链表#

【模板】栈

http://www.nowcoder.com/practice/104ce248c2f04cfb986b92d0548cccbf

import java.util.*;

public class Main {
    static Scanner sc = new Scanner(System.in);
    
    // 数组实现链表
    static void solve2() {
        int n = sc.nextInt();
        sc.nextLine();
        ArrayStack<Integer> stack = new ArrayStack<Integer>();
        while (n-- > 0) {
            String s = sc.nextLine();
            String arr[] = s.split(" ");
            if (arr[0].equals("push")) {
                stack.push(Integer.parseInt(arr[1]));
            } else if (arr[0].equals("pop")) {
                Integer pop = stack.pop();
                if (pop == null) {
                    System.out.println("error");
                } else {
                    System.out.println(pop);
                }
            } else if (arr[0].equals("top")) {
                Integer top = stack.top();
                if (top == null) {
                    System.out.println("error");
                } else {
                    System.out.println(top);
                }
            }
        }
    }
    
    // 链表实现栈的写法
    static void solve() {
        int n = sc.nextInt();
        sc.nextLine();
        LinkedListStack<Integer> stack = new LinkedListStack<>();
        while (n-- > 0) {
            String s = sc.nextLine();
            String arr[] = s.split(" ");
            if (arr[0].equals("push")) {
                stack.push(Integer.parseInt(arr[1]));
            } else if (arr[0].equals("pop")) {
                Integer pop = stack.pop();
                if (pop == null) {
                    System.out.println("error");
                } else {
                    System.out.println(pop);
                }
            } else if (arr[0].equals("top")) {
                Integer top = stack.top();
                if (top == null) {
                    System.out.println("error");
                } else {
                    System.out.println(top);
                }
            }
        }
    }
    public static void main(String[] args) {
        solve();
//         solve2();
    }
}

/////////////////////数组
/**
 * 栈的实现 -- 数组
 * 优点: 一个元素占用一个储存空间
 * 缺点: 初始化申请储存空间太大, 会造成空间的浪费, 初始化申请的储存空间太小, 后期会经常需要对数组扩容, 从而导致性能的下降.
 */
/**
 * 栈的实现 -- 数组
 * 优点: 一个元素占用一个储存空间
 * 缺点: 初始化申请储存空间太大, 会造成空间的浪费, 初始化申请的储存空间太小, 后期会经常需要对数组扩容, 从而导致性能的下降.
 */
/**
 * 使用泛型,以便栈中能够存储我们想要的数据
 * 基于数组的栈实现
 * */
class ArrayStack<E> {

    private Object[] stack;
    private int size;		//栈中元素的个数
    public ArrayStack() {
        stack = new Object[10];	//初始长度为10
    }

    //判断栈是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 返回栈顶的一个元素,但是不进行出栈操作
     * */
    public E top() {
        if(isEmpty()) {
            return null;
        }
        return (E)stack[size -1];		//返回栈顶元素
    }

    public E pop() {
        E e = top();					//取得栈顶数据
        if(size > 0) {					//检查栈中是否有数据
            stack[size - 1] = null;			//将出栈后的位置置为空
            size--;
        }
        //将栈中元素个数减一
        return e;
    }

    public E push(E item) {
        ensureCapacity(size + 1);
        stack[size++] = item;
        return item;

    }

    /**
     * 当栈满的时候,对栈进行扩容
     * */
    private void ensureCapacity(int size) {
        int len = stack.length;
        if(size > len) {		//数组已满
            int newLen = 10;	//每次数组扩充的容量
            stack = Arrays.copyOf(stack, newLen);
        }
    }

    /**
     * 打印出栈中所有的数据
     * */
    public void printStack() {
        System.out.println("开始进行出栈:");
        while(size > 0) {
            System.out.println("出栈:" + pop());
        }
        System.out.println("出栈操作结束!");

    }

}
/////////////////////数组


/////////////////////链表
/**
 * 栈的实现 -- 链表
 * 优点: 使用灵活方便, 只要有需要的时候才会申请空间
 * 缺点: 除了要存储元素外, 还需要额外存储指针(引用)信息
 * @param <T>
 */
class Node<T> {
    T data;
    Node<T> next;
}

class LinkedListStack<T> {
    private Node<T> pHead;

    public LinkedListStack() {
        pHead = new Node<T>();
        pHead.data = null;
        pHead.next = null;
    }

    public int size() {
        int size = 0;
        Node<T> cur = pHead.next;

        while (cur != null) {
            cur = cur.next;
            size++;
        }
        return size;
    }


    public T pop() {
        Node<T> popNode = pHead.next;
        if (popNode == null) return null;
        pHead.next = popNode.next;
        return popNode.data;
    }

    public T top() {
        Node<T> topNode = pHead.next;
        if (topNode == null) return null;
        return topNode.data;
    }

    public void push(T e) {
        Node<T> tlNode = new Node<>();
        tlNode.data = e;
        tlNode.next = pHead.next;
        pHead.next = tlNode;
    }

    public boolean isEmpty() {
        return pHead.next == null;
    }


}
/////////////////////链表

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
12299次浏览 109人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7794次浏览 43人参与
# 米连集团26产品管培生项目 #
6442次浏览 219人参与
# 你的实习产出是真实的还是包装的? #
2157次浏览 44人参与
# 简历第一个项目做什么 #
31858次浏览 345人参与
# 长得好看会提高面试通过率吗? #
1054次浏览 24人参与
# MiniMax求职进展汇总 #
24363次浏览 310人参与
# 重来一次,我还会选择这个专业吗 #
433688次浏览 3926人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187380次浏览 1122人参与
# 牛客AI文生图 #
21472次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152618次浏览 888人参与
# 研究所笔面经互助 #
119003次浏览 577人参与
# 简历中的项目经历要怎么写? #
310603次浏览 4231人参与
# AI时代,哪些岗位最容易被淘汰 #
64131次浏览 839人参与
# 面试紧张时你会有什么表现? #
30537次浏览 188人参与
# 你今年的平均薪资是多少? #
213317次浏览 1039人参与
# 你怎么看待AI面试 #
180372次浏览 1269人参与
# 高学历就一定能找到好工作吗? #
64353次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76715次浏览 374人参与
# 我的求职精神状态 #
448253次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363827次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160736次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务