Java語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)棧代碼詳解
近來復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu),自己動手實(shí)現(xiàn)了棧。棧是一種限制插入和刪除只能在一個位置上的表。最基本的操作是進(jìn)棧和出棧,因此,又被叫作“先進(jìn)后出”表。
首先了解下棧的概念:
棧是限定僅在表頭進(jìn)行插入和刪除操作的線性表。有時又叫LIFO(后進(jìn)先出表)。要搞清楚這個概念,首先要明白”?!霸瓉淼囊馑迹绱瞬拍馨盐毡举|(zhì)。
"?!罢?存儲貨物或供旅客住宿的地方,可引申為倉庫、中轉(zhuǎn)站,所以引入到計算機(jī)領(lǐng)域里,就是指數(shù)據(jù)暫時存儲的地方,所以才有進(jìn)棧、出棧的說法。
實(shí)現(xiàn)方式是這樣的:首先定義了一個接口,然后通過這個接口實(shí)現(xiàn)了線性棧和鏈?zhǔn)綏?,代碼比較簡單,如下:
package com.peter.java.dsa.interfaces;
/**
* 棧操作定義
*
* @author Peter Pan
*/
public interface Stack<T> {
/* 判空 */
Boolean isEmpty();
/* 清空棧 */
void clear();
/* 彈棧 */
T pop();
/* 入棧 */
Boolean push(T data);
/* 棧的長度 */
int length();
/* 查看棧頂?shù)脑兀灰瞥?*/
T peek();
/* 返回對象在棧中的位置 */
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)綏#和ㄟ^單鏈表進(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)行中,以后會繼續(xù)更新代碼。
就是本文關(guān)于Java語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)棧代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
淺談基于SpringBoot實(shí)現(xiàn)一個簡單的權(quán)限控制注解
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)一個簡單的權(quán)限控制注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
windows下java環(huán)境變量的設(shè)置方法
在“系統(tǒng)變量”中,設(shè)置3項屬性,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點(diǎn)擊“編輯”,不存在則點(diǎn)擊“新建”2013-09-09
java9學(xué)習(xí)系列之安裝與jshell使用
2017年9月21日,千呼萬喚始出來,Java9終于發(fā)布了。作為自己天天接觸的“對象”,還是應(yīng)該多花點(diǎn)心思去了解她。后續(xù)再進(jìn)一步了解詳細(xì)特性。下面這篇文章主要給大家介紹了關(guān)于java9學(xué)習(xí)系列之安裝與jshell使用的相關(guān)資料,需要的朋友可以參考下。2017-09-09
SpringBoot集成WebSocket長連接實(shí)際應(yīng)用詳解
這篇文章主要介紹了SpringBoot集成WebSocket長連接實(shí)際應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringAOP中的切點(diǎn)表達(dá)式Pointcut詳解
這篇文章主要介紹了SpringAOP中的切點(diǎn)表達(dá)式Pointcut詳解,Spring?的?AOP?中的一個核心概念是切點(diǎn)(Pointcut),切點(diǎn)表達(dá)式定義通知(Advice)執(zhí)行的范圍,需要的朋友可以參考下2023-08-08
java 使用BigDecimal進(jìn)行貨幣金額計算的操作
這篇文章主要介紹了java 使用BigDecimal進(jìn)行貨幣金額計算的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

