日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 栈队列_java 栈 队列实现

發布時間:2025/4/5 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 栈队列_java 栈 队列实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.棧(stack)

棧是后進先出的(LIFO) 策略的集合類型。

基本API

push(item) 添加一個元素

item pop(item)) 刪除并返回一個元素

isEmpty 棧是否為空

size 棧中的元素數量

讓我們創建一個用數組來實現棧的代碼,并且支持可變數組大小 而且使用率永遠不低于1/4

package com.qing.algorithms;

//一個可變的數組實現棧的方法

public class FixedCapacityStack {

/***

* 一種表示泛型定容棧的數組實現

* FixedCapacityStack(int cap) 創建一個容量為cap的空棧

* push(item) 添加一個元素

*item pop(item)) 刪除并返回一個元素

* isEmpty 棧是否為空

* size 棧中的元素數量

*

*/

private T[] a;

private int N = 0; //有效數量

/***

*

* @param cap 最大存儲數量

*/

public FixedCapacityStack(int cap) {

a = (T[]) new Object[cap];

}

public boolean isEmtry() {

return N == 0;

}

//添加

public void push(T t) {

//如果數組沒有空間 添加兩倍數組長度給它

if (N == a.length) resize(2 * a.length);

a[N++] = t;//先賦值 然后++

}

//推出

public T pop() {

if(isEmtry()){

return null;

}

T item = a[--N];//從0開始

a[N] = null;

//如果數組太大,只用到1/4的空間,將數組減半

if (N > 0 && N == a.length / 4) resize(a.length / 2);

return item;

}

/***

* 創建一個數組賦值給a

* @param max

*/

private void resize(int max) {

T[] temp = (T[]) new Object[max];

for (int i = 0; i < N; i++) {

temp[i] = a[i];

}

a = temp;

}

public void showStack() {

StringBuilder sb = new StringBuilder();

System.out.println("數組大小為 "+ a.length);

for (int i=0 ;i

T item = a[i];

if (item != null) sb.append(" "+i + item.toString());

else sb.append(" "+i +"null");

}

System.out.println(sb.toString());

}

public static void main(String args[]) {

FixedCapacityStack stack = new FixedCapacityStack<>(2);

stack.push("a");

stack.push("b");

stack.push("c");

stack.push("d");

stack.showStack();

stack.pop();

stack.pop();

stack.pop();

stack.showStack();

}

}

/**

數組大小為 4

0a 1b 2c 3d

數組大小為 2

0a

**/

使用單向鏈表實現棧代碼

為什么使用單向鏈表?

因為單向列表已經滿足上面的棧基本api了,但有個缺點,任意位置刪除和插入與鏈表的長度成正比(因為刪除的時候要遍歷鏈表來判斷是否等于要刪除元素),實現任意插入和刪除操作應該使用 雙向鏈表

基本數據類型

private class Node{

T item; //當前元素

Node next; //上一個元素 , 因為后添加壓在上面所以取名為next

}

下面是完整代碼

package com.qing.algorithms;

import java.util.Iterator;

/***

* 使用鏈表實現的棧

* 實現Iterable 可遍歷

* @param

*/

public class Stack implements Iterable {

private Node first; //棧頂(最近添加的元素)

private int N =0; //元素數量

private class Node{

T item;

Node next;

}

public int getSize(){

return N;

}

public boolean isEmpty(){

return first==null;

}

/***

* 向棧頂添加元素

* @param item

*/

public void push(T item){

Node oldFirst =first;//第一次push first為null

first = new Node();

first.item = item;

first.next = oldFirst; //指向上一個元素

N++;

}

/***

* 向棧頂刪除元素

*/

public T pop(){

T item = first.item;

first =first.next;

N--;

return item;

}

@Override

public Iterator iterator() {

return new StackIterator();

}

private class StackIterator implements Iterator{

private Node current = first;

@Override

public boolean hasNext() {

return current!=null;

}

@Override

public T next() {

T item = current.item;

current = current.next;

return item;

}

}

private void showStack() {

int i =0;

StringBuilder sb = new StringBuilder();

for (T t : this) {

sb.append(" " + i + t);

i++;

}

System.out.println(sb.toString());

}

public static void main(String args[]) {

Stack stack = new Stack<>();

stack.push("a");

stack.push("b");

stack.push("c");

stack.push("d");

stack.showStack();

stack.pop();

stack.pop();

stack.pop();

stack.showStack();

}

}

/***

0d 1c 2b 3a

0a

**/

1.隊列(Queue)

void enqueue(Item item) 添加一個元素

Item dequeue() 刪除最早添加的元素

booean isEmtry() 隊列是否為null

int size() 隊列中的元素數量

總結

以上是生活随笔為你收集整理的java 栈队列_java 栈 队列实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。