Java实现数据结构栈
1、定义接口/** * 栈接口 * param T 元素类型 */ public interface StackT { /** * 入栈 * param element 要入栈的元素 * return 是否入栈成功 */ boolean push(T element); /** * 出栈 * return 出栈的元素 */ T pop(); /** * 查看栈顶元素 * return 栈顶元素 */ T peek(); /** * 检查栈是否为空 * return 是否为空 */ boolean isEmpty(); /** * 获取栈的大小 * return 栈的大小 */ int size(); /** * 清空栈 */ void clear(); }2、基于数组的栈实现/** * 基于数组的栈实现 * param T 元素类型 */ public class ArrayStackT implements StackT { private static final int DEFAULT_CAPACITY 10; private T[] elements; private int size; SuppressWarnings(unchecked) public ArrayStack() { elements (T[]) new Object[DEFAULT_CAPACITY]; size 0; } SuppressWarnings(unchecked) public ArrayStack(int capacity) { if (capacity 0) { throw new IllegalArgumentException(容量必须大于0); } elements (T[]) new Object[capacity]; size 0; } Override public boolean push(T element) { ensureCapacity(); elements[size] element; return true; } Override public T pop() { if (isEmpty()) { throw new RuntimeException(栈为空); } T element elements[--size]; elements[size] null; // 避免内存泄漏 return element; } Override public T peek() { if (isEmpty()) { throw new RuntimeException(栈为空); } return elements[size - 1]; } Override public boolean isEmpty() { return size 0; } Override public int size() { return size; } Override public void clear() { for (int i 0; i size; i) { elements[i] null; // 避免内存泄漏 } size 0; } /** * 确保容量足够 */ private void ensureCapacity() { if (size elements.length) { // 扩容为原来的2倍 SuppressWarnings(unchecked) T[] newElements (T[]) new Object[elements.length * 2]; System.arraycopy(elements, 0, newElements, 0, size); elements newElements; } } /** * 遍历栈从栈底到栈顶 */ public void traverse() { System.out.print(栈: [); for (int i 0; i size; i) { System.out.print(elements[i]); if (i size - 1) { System.out.print(, ); } } System.out.println(]); } }3、基于链表的栈实现/** * 基于链表的栈实现 * param T 元素类型 */ public class LinkedStackT implements StackT { private NodeT top; private int size; private static class NodeT { T data; NodeT next; Node(T data) { this.data data; this.next null; } } public LinkedStack() { top null; size 0; } Override public boolean push(T element) { NodeT newNode new Node(element); newNode.next top; top newNode; size; return true; } Override public T pop() { if (isEmpty()) { throw new RuntimeException(栈为空); } T element top.data; top top.next; size--; return element; } Override public T peek() { if (isEmpty()) { throw new RuntimeException(栈为空); } return top.data; } Override public boolean isEmpty() { return size 0; } Override public int size() { return size; } Override public void clear() { top null; size 0; } /** * 遍历栈从栈底到栈顶 */ public void traverse() { System.out.print(栈: [); // 使用辅助栈来实现从栈底到栈顶的遍历 LinkedStackT tempStack new LinkedStack(); NodeT current top; while (current ! null) { tempStack.push(current.data); current current.next; } while (!tempStack.isEmpty()) { System.out.print(tempStack.pop()); if (!tempStack.isEmpty()) { System.out.print(, ); } } System.out.println(]); } }4、测试验证** * 栈测试类 */ public class StackTest { public static void main(String[] args) { System.out.println(测试数组栈); testStack(new ArrayStack()); System.out.println(\n测试链表栈); testStack(new LinkedStack()); } private static void testStack(StackInteger stack) { // 入栈 stack.push(1); stack.push(2); stack.push(3); stack.push(4); stack.push(5); // 遍历栈 if (stack instanceof ArrayStack) { ((ArrayStackInteger) stack).traverse(); } else if (stack instanceof LinkedStack) { ((LinkedStackInteger) stack).traverse(); } // 查看栈顶元素 System.out.println(栈顶元素 stack.peek()); // 查看栈大小 System.out.println(栈大小 stack.size()); // 出栈 System.out.println(出栈元素 stack.pop()); System.out.println(出栈元素 stack.pop()); // 遍历栈 if (stack instanceof ArrayStack) { ((ArrayStackInteger) stack).traverse(); } else if (stack instanceof LinkedStack) { ((LinkedStackInteger) stack).traverse(); } // 检查是否为空 System.out.println(栈是否为空 stack.isEmpty()); // 清空栈 stack.clear(); System.out.println(清空后栈是否为空 stack.isEmpty()); System.out.println(清空后栈大小 stack.size()); } }实现内容栈接口(StackT)定义了栈的基本操作方法push入栈、pop出栈、peek查看栈顶、isEmpty检查是否为空、size获取大小、clear清空栈基于数组的栈(ArrayStackT)使用数组存储元素支持动态扩容提供了从栈底到栈顶的遍历方法适用于需要频繁随机访问的场景基于链表的栈(LinkedStackT)使用链表存储元素不需要预先分配容量提供了从栈底到栈顶的遍历方法适用于频繁插入和删除的场景测试类(StackTest)演示了如何使用两种栈实现测试了栈的基本操作核心操作入栈将元素添加到栈顶出栈移除并返回栈顶元素查看栈顶返回栈顶元素但不移除检查是否为空判断栈是否为空获取大小返回栈中元素的个数清空栈移除所有元素
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2441533.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!