摘要:要實(shí)現(xiàn),至少應(yīng)該包括出棧操作,彈出棧頂元素。入棧操作查看棧頂元素棧為空另外,實(shí)現(xiàn)一個(gè)棧,還應(yīng)該考慮到幾個(gè)問題棧的初始大小以及棧滿以后如何新增??臻g對(duì)棧進(jìn)行更新時(shí)需要進(jìn)行同步有三種實(shí)現(xiàn)的方式,數(shù)組,容器,以及鏈表的方法。
雖是讀書筆記,但是如轉(zhuǎn)載請(qǐng)注明出處http://segmentfault.com/blog/exploring/
..拒絕伸手復(fù)制黨
想更一進(jìn)步的支持我,請(qǐng)掃描下方的二維碼,你懂的~
棧(Stack)是限制僅在表的一端進(jìn)行插入和刪除運(yùn)算的線性表。
java 沒有棧這樣的數(shù)據(jù)結(jié)構(gòu),如果想利用先進(jìn)后出(FILO)這樣的數(shù)據(jù)結(jié)構(gòu),就必須自己實(shí)現(xiàn)。
要實(shí)現(xiàn)Stack,至少應(yīng)該包括:
1. pop() 出棧操作,彈出棧頂元素。
2. push(E e) 入棧操作
3. peek() 查看棧頂元素
4. isEmpty() 棧為空
另外,實(shí)現(xiàn)一個(gè)棧,還應(yīng)該考慮到幾個(gè)問題:
1. 棧的初始大小以及棧滿以后如何新增棧空間
2. 對(duì)棧進(jìn)行更新時(shí)需要進(jìn)行同步
有三種實(shí)現(xiàn)的方式,數(shù)組,容器,以及鏈表的方法。
數(shù)據(jù):
javapackage gsm; import java.util.*; public class StackArray{ private int[] array;//用數(shù)組實(shí)現(xiàn) private int top; //棧頂指針 private final static int size = 100; public StackArray(){ array = new int[size]; top = -1; //??盏臅r(shí)候 } //壓棧 public void push(int element){ if(top == size-1){ throw new StackOverflowError(); } else array[++top] = element; } //彈棧 public int pop(){ if(top == -1){ throw new EmptyStackException(); } return array[top--]; } //判斷是否為空 public boolean isEmpty(){ return top == -1; } //返回棧頂元素 public Integer peek(){ if(top == -1){ throw new EmptyStackException(); } return array[top]; } }
容器
javapackage gsm; public interface Stack{ public T pop(); public void push(T element); public boolean isEmpty(); public T peek(); } package gsm; import java.util.*; public class StackList implements Stack { private List list ; //用容器實(shí)現(xiàn) StackList(){ list = new ArrayList (); } //彈棧 public T pop(){ if(this.isEmpty() == true){ throw new EmptyStackException(); } return list.remove(list.size()-1); } //壓棧 public void push(T element){ list.add(element); } //判斷是否為空 public boolean isEmpty(){ return list.size() == 0; } //返回棧頂元素 public T peek(){ if(this.isEmpty() == true){ throw new EmptyStackException(); } return list.get(list.size()-1); } }
鏈表
javapackage gsm; import java.util.EmptyStackException; public class LinkedStackimplements Stack { //不用容器或者數(shù)組等數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)節(jié)點(diǎn) //Node定義一個(gè)節(jié)點(diǎn)類 private static class Node{ private U item; //存儲(chǔ)的data private Node next; //類似指針 Node(){ this.item = null; this.next = null; } Node(U item, Node next){ this.item = item; this.next = next; } boolean end(){ return item == null && next == null; } } private Node top ; //棧頂指針 LinkedStack(){ top = new Node (); } //彈棧 public T pop(){ if(this.isEmpty() == true){ throw new EmptyStackException(); } T result = top.item; if(!top.end()) { top = top.next; } return result; } //壓棧 public void push(T element){ top = new Node (element, top); } //判斷是否為空 public boolean isEmpty(){ return top.end(); } //返回棧頂元素 public T peek(){ if(this.isEmpty() == true){ throw new EmptyStackException(); } T result = top.item; return result; } }
可以發(fā)現(xiàn)容器果然是java的一個(gè)利器,方便高效。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64250.html
摘要:常見數(shù)據(jù)結(jié)構(gòu)分析及實(shí)現(xiàn)說明本文中的代碼是參考編程思想某培訓(xùn)機(jī)構(gòu)。同時(shí)還要分析這些數(shù)據(jù)結(jié)構(gòu)在時(shí)間和空間上的開銷。這種專門研究應(yīng)用程序中的數(shù)據(jù)之間的邏輯關(guān)系,存儲(chǔ)方式及其操作的學(xué)問就是數(shù)據(jù)結(jié)構(gòu)。 常見數(shù)據(jù)結(jié)構(gòu)分析及實(shí)現(xiàn) 說明 本文中的代碼是參考《Java編程思想》、某培訓(xùn)機(jī)構(gòu)。 文中的代碼放Github了,有興趣的可以看看,點(diǎn)歌star鼓勵(lì)下我。 代碼在Sublime中敲的,坑爹的GBK...
Java是面向?qū)ο蟮恼Z言,對(duì)象時(shí)Java不可或缺的一個(gè)元素,基本數(shù)據(jù)類型有數(shù)組用來存儲(chǔ),那么對(duì)象元素有什么存儲(chǔ)呢,這就是集合,集合是Java非常重要的一塊知識(shí),Java編程思想中的持有對(duì)象簡述了集合的相關(guān)知識(shí),下面簡述集合的相關(guān)功能: showImg(/img/bVC153); 集合類我們通常稱為容器 其實(shí)容器只有四種:Map、List、Set和Queue 常用的容器有ArrayList、Lin...
摘要:為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)語言是相通的人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。其實(shí),真正想通的不是語言,而是數(shù)據(jù)結(jié)構(gòu)與算法。 為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu) 1.語言是相通的 人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。個(gè)人認(rèn)為這是一個(gè)似是而非的觀點(diǎn),每門編程語言都離不開變量,數(shù)組,循環(huán),條件判斷這些概念,這似乎能支持上面的觀點(diǎn),但是每門編程語言都有自己的使用范...
摘要:為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)語言是相通的人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。其實(shí),真正想通的不是語言,而是數(shù)據(jù)結(jié)構(gòu)與算法。 為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu) 1.語言是相通的 人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。個(gè)人認(rèn)為這是一個(gè)似是而非的觀點(diǎn),每門編程語言都離不開變量,數(shù)組,循環(huán),條件判斷這些概念,這似乎能支持上面的觀點(diǎn),但是每門編程語言都有自己的使用范...
摘要:在改進(jìn)前使用數(shù)組的一個(gè)缺點(diǎn)是必須聲明數(shù)組的大小,所以棧有確定的容量。待解決的問題建立一個(gè)能夠增長或者縮短到任意大小的棧。下邊的圖是觀察時(shí)間開銷的另一種方式,表示了入棧操作需要訪問數(shù)組的次數(shù)。 前言 上一篇:算法分析下一篇:基本排序 本篇內(nèi)容主要是棧,隊(duì)列 (和包)的基本數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)文章里頭所有的對(duì)數(shù)函數(shù)都是以 2 為底關(guān)于性能分析,可能還是需要一些數(shù)學(xué)知識(shí),有時(shí)間可以回一下在很多...
閱讀 1540·2023-04-26 00:25
閱讀 928·2021-09-27 13:36
閱讀 937·2019-08-30 14:14
閱讀 2187·2019-08-29 17:10
閱讀 1019·2019-08-29 15:09
閱讀 1956·2019-08-28 18:21
閱讀 975·2019-08-26 13:27
閱讀 988·2019-08-26 10:58