生活随笔
收集整理的這篇文章主要介紹了
Java实现 栈 和 队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JAVA面試題編程題:
請用JAVA實現兩個類,分別實現堆棧(Stack)和隊列(Queue)操作
package com.lcx.interview;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 29. 請用JAVA實現兩個類,分別實現堆棧(Stack)和隊列(Queue)操作。 堆棧:* 棧(Stack)是限制僅在表的一端進行插入和刪除運算的線性表。 棧為后進先出(Last In First Out)的線性表,簡稱為 LIFO 表。* 一般用List來當模擬容器,常用方法 是否有數據、彈出pop數據、壓入push數據、數據量* * 隊列: 是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進行刪除操作,* 而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。 進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。 模擬* * @author */
public class Interview_29_StackQueue {public static void main(String[] args) {System.out.println("--------------------堆棧--------------------");MyStack<Integer> stack = new MyStack<Integer>();System.out.println("剛創建堆棧時,stack.isEmpty():" + stack.isEmpty() +",stack.size():" + stack.size());stack.push(1);stack.push(2);stack.push(3);System.out.println("push 3個元素時,stack.size():" + stack.size() + ",stack.toString():" + stack.toString());stack.pop();stack.pop();System.out.println("pop 2個元素時,stack.size():" + stack.size() + ",stack.toString():" + stack.toString());System.out.println("--------------------隊列--------------------");MyQueue<Integer> queue = new MyQueue<Integer>(5);System.out.println("剛創建堆棧時,queue.isEmpty():" + queue.isEmpty() +",queue.isFull():"+queue.isFull()+ ",queue.size():" + queue.size());for (int i = 0; i < 3; i++) {queue.add(i);}System.out.println("添加3個元素:");System.out.println("queue.getHead():"+queue.getHead()+",queue.getTail():"+queue.getTail()+",queue.size():"+queue.size());System.out.println(queue);System.out.println("干掉2個元素:");//干掉元素,元素只是不能訪問到了,被干掉的元素可以被添加的覆蓋queue.remove();queue.remove();System.out.println("queue.getHead():"+queue.getHead()+",queue.getTail():"+queue.getTail()+",queue.size():"+queue.size());System.out.println(queue);for (int i = 3; i < 7; i++) {queue.add(i);}System.out.println("添加4個元素:");//此時尾指又要從開始出添加元素System.out.println("queue.getHead():"+queue.getHead()+",queue.getTail():"+queue.getTail()+",queue.size():"+queue.size());System.out.println(queue);System.out.println("干掉4個元素:");//此時尾指又要從開始出添加元素queue.remove();queue.remove();queue.remove();queue.remove();System.out.println("queue.getHead():"+queue.getHead()+",queue.getTail():"+queue.getTail()+",queue.size():"+queue.size());System.out.println(queue);}}class MyStack<E> {private List<E> list;public MyStack() {list = new ArrayList<E>();}/*** 棧是否為空* * @return*/public boolean isEmpty() {return list.size() == 0;}/*** 棧內容長度* * @return*/public int size() {return list.size();}/*** 添加元素* * @param e*/public void push(E e) {list.add(e);}/*** 彈出元素* * @return*/public E pop() {if (list.size() > 0) {return list.remove(list.size() - 1);}return null;}@Overridepublic String toString() {return Arrays.toString(list.toArray());}
}class MyQueue<E> {private int maxSize;// 隊列容量private E queue[];// 隊列private int head;// 頭指針private int tail;// 尾指針private int nItems;// 元素個數@SuppressWarnings("unchecked")public MyQueue(int maxSize) {this.maxSize = maxSize;this.queue = (E[]) new Object[maxSize];this.head = 0;// 移除元素一般從下標0開始,頭指針指向待移除的元素(也就是移除元素的下標)this.tail = -1;// 一般設為-1,當添加元素后,尾指針數值為當前已經添加的元素的下標位置this.nItems = 0;}/*** 隊列是否為空* * @return*/public boolean isEmpty() {return nItems == 0;}/*** 隊列是否已滿* * @return*/public boolean isFull() {return nItems == queue.length;}/*** 添加從隊尾開始* * @param e*/public void add(E e) {if (isFull()) {throw new RuntimeException("隊列已滿");}// 當隊尾指針已經到達數組的末尾,但數組卻未填滿(數組前面有空缺),此時又從起始位置添加元素if (tail == maxSize - 1) {tail = -1;}queue[++tail] = e;nItems++;}/*** 刪除從對頭開始* * @return*/public E remove() {if (isEmpty()) {throw new RuntimeException("隊列已空");}// 當對頭指針到達數組末尾,但數組個數卻不為空(說明數組前面還有元素),此時又從起始位置刪除元素if (head == maxSize) {head = 0;}nItems--;return queue[head++];}/*** 獲取對頭元素* * @return*/public E getHead() {return queue[head];}/*** 獲取隊尾元素* * @return*/public E getTail() {return queue[tail];}/*** 隊列元素個數* * @return*/public int size() {return nItems;}@Overridepublic String toString() {return Arrays.toString(queue);}}
結果截圖:
總結
以上是生活随笔為你收集整理的Java实现 栈 和 队列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。