Java語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)棧代碼詳解
近來(lái)復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu),自己動(dòng)手實(shí)現(xiàn)了棧。棧是一種限制插入和刪除只能在一個(gè)位置上的表。最基本的操作是進(jìn)棧和出棧,因此,又被叫作“先進(jìn)后出”表。
首先了解下棧的概念:
棧是限定僅在表頭進(jìn)行插入和刪除操作的線性表。有時(shí)又叫LIFO(后進(jìn)先出表)。要搞清楚這個(gè)概念,首先要明白”?!霸瓉?lái)的意思,如此才能把握本質(zhì)。
"?!罢?存儲(chǔ)貨物或供旅客住宿的地方,可引申為倉(cāng)庫(kù)、中轉(zhuǎn)站,所以引入到計(jì)算機(jī)領(lǐng)域里,就是指數(shù)據(jù)暫時(shí)存儲(chǔ)的地方,所以才有進(jìn)棧、出棧的說(shuō)法。
實(shí)現(xiàn)方式是這樣的:首先定義了一個(gè)接口,然后通過(guò)這個(gè)接口實(shí)現(xiàn)了線性棧和鏈?zhǔn)綏?,代碼比較簡(jiǎn)單,如下:
package com.peter.java.dsa.interfaces;
/**
* 棧操作定義
*
* @author Peter Pan
*/
public interface Stack<T> {
/* 判空 */
Boolean isEmpty();
/* 清空棧 */
void clear();
/* 彈棧 */
T pop();
/* 入棧 */
Boolean push(T data);
/* 棧的長(zhǎng)度 */
int length();
/* 查看棧頂?shù)脑兀灰瞥?*/
T peek();
/* 返回對(duì)象在棧中的位置 */
int search(T data);
}
線性棧:以數(shù)組的方式實(shí)現(xiàn)。
package com.peter.java.dsa.common;
import com.peter.java.dsa.interfaces.Stack;
/**
* 線性棧
*
* @author Peter Pan
*/
public class LinearStack<T> implements Stack<T> {
@SuppressWarnings("unchecked")
private T[] t = (T[]) new Object[16];
private int size = 0;
@Override
public Boolean isEmpty() {
// TODO Auto-generated method stub
return size == 0;
}
@Override
public void clear() {
// TODO Auto-generated method stub
for (int i = 0; i < t.length; i++) {
t[i] = null;
}
size = 0;
}
@Override
public T pop() {
// TODO Auto-generated method stub
if (size == 0) {
return null;
}
T tmp = t[size - 1];
t[size - 1] = null;
size--;
return tmp;
}
@Override
public Boolean push(T data) {
// TODO Auto-generated method stub
if (size >= t.length) {
resize();
}
t[size++] = data;
return true;
}
@Override
public int length() {
// TODO Auto-generated method stub
return size;
}
@Override
public T peek() {
// TODO Auto-generated method stub
if (size == 0) {
return null;
} else {
return t[size - 1];
}
}
/* return index of data, return -1 if no data */
@Override
public int search(T data) {
// TODO Auto-generated method stub
int index = -1;
for (int i = 0; i < t.length; i++) {
if (t[i].equals(data)) {
index = i;
break;
}
}
return index;
}
@SuppressWarnings("unchecked")
private void resize() {
T[] tmp = (T[]) new Object[t.length * 2];
for (int i = 0; i < t.length; i++) {
tmp[i] = t[i];
t[i] = null;
}
t = tmp;
tmp = null;
}
/* from the left to the right is from the top to the bottom of the stack */
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuffer buffer = new StringBuffer();
buffer.append("Linear Stack Content:[");
for (int i = t.length - 1; i > -1; i--) {
buffer.append(t[i].toString() + ",");
}
buffer.append("]");
buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
return buffer.toString();
}
}
鏈?zhǔn)綏#和ㄟ^(guò)單鏈表進(jìn)行實(shí)現(xiàn)。
package com.peter.java.dsa.common;
import com.peter.java.dsa.interfaces.Stack;
public class LinkedStack<T> implements Stack<T> {
private Node top;
private int size;
@Override
public Boolean isEmpty() {
// TODO Auto-generated method stub
return size == 0;
}
@Override
public void clear() {
// TODO Auto-generated method stub
top = null;
size = 0;
}
@Override
public T pop() {
// TODO Auto-generated method stub
T topValue = null;
if (top != null) {
topValue = top.data;
Node oldTop = top;
top = top.prev;
oldTop.prev = null;
size--;
}
return topValue;
}
@Override
public Boolean push(T data) {
// TODO Auto-generated method stub
Node oldTop = top;
top = new Node(data);
top.prev = oldTop;
size++;
return true;
}
@Override
public int length() {
// TODO Auto-generated method stub
return size;
}
@Override
public T peek() {
// TODO Auto-generated method stub
T topValue = null;
if (top != null) {
topValue = top.data;
}
return topValue;
}
@Override
public int search(T data) {
// TODO Auto-generated method stub
int index = -1;
Node tmp = top;
for (int i = size - 1; i > -1; i--) {
if (tmp.data.equals(data)) {
index = i;
break;
} else {
tmp = tmp.prev;
}
}
tmp = null;
return index;
}
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuffer buffer = new StringBuffer();
buffer.append("Linked Stack Content:[");
Node tmp = top;
for (int i = 0; i < size - 1; i++) {
buffer.append(tmp.toString() + ",");
tmp = tmp.prev;
}
tmp = null;
buffer.append("]");
buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
return super.toString();
}
private class Node {
T data;
Node prev;
public Node(T data) {
// TODO Auto-generated constructor stub
this.data = data;
}
}
}
學(xué)習(xí)還在進(jìn)行中,以后會(huì)繼續(xù)更新代碼。
就是本文關(guān)于Java語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)棧代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
- java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列
- java 數(shù)據(jù)結(jié)構(gòu)中棧結(jié)構(gòu)應(yīng)用的兩個(gè)實(shí)例
- Java模擬棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本示例講解
- 用Java代碼實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納
- Java中使用數(shù)組實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)實(shí)例
- java數(shù)據(jù)結(jié)構(gòu)之java實(shí)現(xiàn)棧
相關(guān)文章
SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄
微信的登錄功能是用戶注冊(cè)和使用微信的必經(jīng)之路之一,而微信授權(quán)登錄更是方便了用戶的登錄操作,本文主要介紹了SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄,感興趣的可以了解一下2023-09-09
SpringBoot多數(shù)據(jù)源配置的全過(guò)程記錄
在用SpringBoot開(kāi)發(fā)項(xiàng)目時(shí),隨著業(yè)務(wù)量的擴(kuò)大,我們通常會(huì)進(jìn)行數(shù)據(jù)庫(kù)拆分或是引入其他數(shù)據(jù)庫(kù),從而我們需要配置多個(gè)數(shù)據(jù)源,下面這篇文章主要給大家介紹了關(guān)于SpringBoot多數(shù)據(jù)源配置的相關(guān)資料,需要的朋友可以參考下2021-11-11
SpringBoot實(shí)現(xiàn)各種參數(shù)校驗(yàn)總結(jié)(建議收藏!)
本文深入解析了Spring?Validation的使用方法、實(shí)現(xiàn)原理及最佳實(shí)踐,詳細(xì)介紹了各種參數(shù)校驗(yàn)場(chǎng)景,如requestBody和requestParam/PathVariable的使用,并探討了分組校驗(yàn)、嵌套校驗(yàn)和自定義校驗(yàn)的高級(jí)應(yīng)用,需要的朋友可以參考下2024-09-09
Spring?Boot?整合?FreeMarker?實(shí)例分享
這篇文章主要分享了Spring?Boot整合FreeMarker?實(shí)例FreeMarker是一款模板引擎,即一種基于模板和要改變的數(shù)據(jù),并用來(lái)生成輸出文本,更多相關(guān)介紹需要的小伙伴可以參考下面文章內(nèi)容2022-05-05
Springboot開(kāi)發(fā)OAuth2認(rèn)證授權(quán)與資源服務(wù)器操作
這篇文章主要介紹了Springboot開(kāi)發(fā)OAuth2認(rèn)證授權(quán)與資源服務(wù)器操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot讀取配置優(yōu)先級(jí)順序的方法詳解
Spring Boot作為一種輕量級(jí)的Java應(yīng)用程序框架,以其開(kāi)箱即用、快速搭建新項(xiàng)目的特性贏得了廣大開(kāi)發(fā)者的青睞,在Spring Boot生態(tài)系統(tǒng)中,配置屬性可以從各種來(lái)源獲取,本文將深入探討Spring Boot加載外部配置屬性的優(yōu)先級(jí)規(guī)則,需要的朋友可以參考下2024-05-05
關(guān)于Java的動(dòng)態(tài)代理機(jī)制
這篇文章主要介紹了關(guān)于Java的動(dòng)態(tài)代理機(jī)制,動(dòng)態(tài)代理就是,在程序運(yùn)行期,創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,并對(duì)目標(biāo)對(duì)象中的方法進(jìn)行功能性增強(qiáng)的一種技術(shù),需要的朋友可以參考下2023-05-05
java 同步器SynchronousQueue詳解及實(shí)例
這篇文章主要介紹了java 同步器SynchronousQueue詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05

