public class ArrayStack<Item> { // 栈元素的总数 private int N = 0; // 存放栈元素的数组 private Item [] items; public ArrayStack (int M) { items = (Item[]) new Object[M]; } /** * @description: 调整栈的大小 */ private void resize (int max) { Item [] temp = (Item [])new Object[max]; for (int i =0;i<items.length;i++) { temp[i] = items[i]; } items = temp; } /** * @description: 向栈顶插入元素 */ public void push (Item item) { // 当栈满了的时候, 将栈的数组大小扩大为原来两倍 if (N==items.length) resize(2*N); items[N++] = item; } /** * @description: 从栈顶删除元素,并将删除的元素返回 */ public Item pop () { // 当栈仍是空的时候, 不删除而且返回空 if(isEmpty()) return null; // 保存将要被删除的元素 Item i = items[N-1]; // 将该元素删除 items[N-1] = null; // 栈的长度减1 N--; return i; } /** * @description: 判断栈是否为空 */ public boolean isEmpty () { return N == 0; } /** * @description: 返回栈的大小 */ public int size () { return N; } public static void main (String args []) { // 开始时指定栈的容量为2 ArrayStack<Integer> stack = new ArrayStack<>(2); // 向栈顶依次添加3个元素 stack.push(1); stack.push(2); stack.push(3); // 添加3后栈的容量自动扩大了 // 依次从栈顶删除3个元素 System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.pop()); } }
3 2 1
public class LinkedListStack<Item> { // 栈中元素的总数 private int N = 0; // 链表头元素 private Node front; // 内部结点类 private class Node { Item item; Node next; } /** * @description: 向栈顶插入元素 */ public void push (Item item) { Node oldFront = front; // 向链表头部插入新的结点 front = new Node(); front.item = item; // 将新头结点的next指针指向旧的头结点 front.next = oldFront; // 栈的长度加1 N++; } /** * @description: 向栈顶删除元素,并将删除的元素返回 */ public Item pop () { // 当栈仍是空的时候, 不删除而且返回空 if(isEmpty()) return null; // 保存待删除的项以便返回 Item item = front.item; // 删除原头结点 front = front.next; // 栈的长度减1 N--; return item; } /** * @description: 判断栈是否为空 */ public boolean isEmpty () { return N == 0; } /** * @description: 返回栈的大小 */ public int size () { return N; } public static void main (String args []) { // 建立栈 LinkedListStack<Integer> stack = new LinkedListStack<>(); // 向栈顶依次添加3个元素 stack.push(1); stack.push(2); stack.push(3); // 依次从栈顶删除3个元素 System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.pop()); } }
3 2 1
public class LinkedListQueue<Item> { // 链表中的结点数目 private int N = 0; // 链表头结点 private Node front = null; // 链表尾结点 private Node rear = null; // 结点内部类 private class Node { Item item; Node next; } /** * @description: 元素入列(在链表尾部添加) */ public void enqueue (Item item) { Node oldRear = rear; rear = new Node(); rear.item = item; if (isEmpty()) front = rear; else oldRear.next = rear; N++; } /** * @description: 元素出列(在链表头部删除) */ public Item dequeue () { if(isEmpty()) return null; Item item = front.item; front = front.next; N--; if(isEmpty()) rear = null; return item; } /** * @description: 判断队列是否为空 */ public boolean isEmpty () { return N == 0; } /** * @description: 返回队列长度 */ public int size () { return N; } public static void main (String args []) { LinkedListQueue<String> queue = new LinkedListQueue<>(); queue.enqueue("A"); queue.enqueue("B"); queue.enqueue("C"); queue.enqueue("D"); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); } }
A
B
C
D
/** * @description: 元素入列(在链表头部添加) */ public void enqueue (Item item) { Node oldFront = front; front = new Node(); front.item = item; front.next = oldFront; if (isEmpty()) rear = front; N++; } /** * @description: 元素出列(在链表尾部删除) */ public Item dequeue () { if (isEmpty()) return null; if (size()==1) { Item item = rear.item; front = null; rear = null; N--; return item; } Node x = front; while (!x.next.equals(rear)) { x=x.next; } Item item = x.next.item; x.next = null; rear = x; N--; return item; }
public class CircleArrayQueue<Item> { // 队列元素总数 private int N = 0; // 数组长度 private int M; // 队列头部元素指针 private int front = 0; // 队列尾部元素指针 private int rear = 0; private Item [] items; public CircleArrayQueue (int M) { this.M = M; items = (Item [])new Object[M]; } /** * @description: 入列操做 */ public void enqueue (Item item) { // 当队列为空时, 不能进行入列操做 if (isFull()) return; // 向队列尾部插入元素 items[rear] = item; // 用数组长度M取余, 使得rear到达数组尾部时能返回数组头部 rear = (rear + 1) % M; // 增长队列长度 N++; } /** * @description: 出列,并返回被删除项 */ public Item dequeue () { // 当队列为满时, 不能进行出列操做 if (isEmpty()) return null; // 保存待删除元素, 以待返回 Item item = items[front]; // 删除队列头部元素 items[front] = null; // 用数组长度M取余, 使得front到达数组尾部时能返回数组头部 front = (front + 1) % M; // 减小队列长度 N--; // 返回删除元素 return item; } /** * @description: 判断队列是否满了 */ public boolean isFull () { return N == M; } /** * @description: 判断队列是否为空 */ public boolean isEmpty () { return N == 0; } /** * @description: 返回队列元素总数 */ public int size () { return N; } public static void main (String args []) { CircleArrayQueue<Integer> queue = new CircleArrayQueue<>(3); // 依次入列三个元素 queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); // 依次出列三个元素 System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); } }
1 2 3
public class CircleArrayQueue2<Item> { private int M; private int front = 0; private int rear = 0; private Item [] items; public CircleArrayQueue2 (int M) { this.M = M; items = (Item [])new Object[M]; } public void enqueue (Item item) { if (isFull()) return; items[rear] = item; rear = (rear + 1) % M; } public Item dequeue () { if (isEmpty()) return null; Item item = items[front]; items[front] = null; front = (front + 1) % M; return item; } public boolean isFull () { return (rear + 1) % M == front; } public boolean isEmpty () { return rear == front; } public static void main (String args []) { CircleArrayQueue2<Integer> queue = new CircleArrayQueue2<>(3); queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); } }
1
2
null