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