用Java代碼實現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納
鏈式實現(xiàn):
在棧的一段添加和刪除元素,在棧中維護一個指向棧頂?shù)慕Y(jié)點和一個count變量指示棧的大?。?br />
private LinearNode top; //指向棧頂
private int count;//標記棧的大小
每次出棧和壓棧在鏈表的表頭:(也可以再表尾,實現(xiàn)方式不一樣而已)
top--->元素1--->元素2--->元素3.........
實現(xiàn)(附帶測試main):
LinkedStack
package Stack;
import Bag.LinearNode;
//為了重點來實現(xiàn)算法,將異常情況直接打印出然后退出程序,不再聲明異常類
public class LinkedStack implements StackADT {
private LinearNode top; //指向棧頂
private int count;//標記棧的大小
public static void main(String[] args){
LinkedStack stack = new LinkedStack();
System.out.println("將0到10依次壓棧");
for(int i = 0;i < 10;i++)
stack.push(i);
System.out.println("連續(xù)執(zhí)行5次出棧操作");
for(int i = 0;i < 5;i++)
stack.pop();
System.out.println("棧為空嗎?: " + stack.isEmpty());
System.out.println("棧的大小為: " + stack.size());
System.out.println("棧頂元素為: " + stack.top.getElement());
System.out.println("棧頂元素為: " + stack.peek());
}
public LinkedStack()
{
top = null;
count = 0;
}
public int size() {
return count;
}
public boolean isEmpty() {
return (size() == 0);
}
public void push(Object element) {
LinearNode node = new LinearNode(element);
node.setNext(top);
top = node;
count++;
}
public Object pop() {
if(isEmpty())
{
System.out.println("stack is empty!");
System.exit(1);
}
Object result = top.getElement();
top = top.getNext();
count--;
return result;
}
public Object peek() {
Object result = top.getElement();
return result;
}
}
運行結(jié)果:
將0到10依次壓棧
連續(xù)執(zhí)行5次出棧操作
棧為空嗎?: false
棧的大小為: 5
棧頂元素為: 4
棧頂元素為: 4
數(shù)組實現(xiàn):
棧底總是數(shù)組下標為0的位置,入棧出棧從數(shù)組下標的最后一個元素開始:
private Object[] contents; private int top;//top標記下一個入棧的位置,同時也表示棧的容量大小,跟鏈式實現(xiàn)的count比較一下?。?!
實現(xiàn)(附帶測試main):
ArrayStack
package Stack;
public class ArrayStack implements StackADT {
private Object[] contents;
private int top;//top標記下一個入棧的位置,同時也表示棧的容量大小,跟鏈式實現(xiàn)的count比較一下?。。?
private static int SIZE = 10;
public ArrayStack()
{
contents = new Object[SIZE];
top = 0;
}
public void expand(){//借助于申請一個輔助空間,每次擴展容量一倍
Object[] larger = new Object[size()*2];
for(int index = 0;index < top;index++)
larger[index] = contents[index];
contents = larger;
}
public int size() {
return top;
}
public boolean isEmpty() {
return (size() == 0);
}
public void push(Object element) {
//if(isEmpty())
//expand();
if(top == contents.length)
expand();
contents[top] = element;
top++;
}
public Object pop() {
if(isEmpty())
{
System.out.println("stack is empty!");
System.exit(1);
}
Object result = contents[top-1];
contents[top-1] = null;//出棧
top--;
return result;
/*書上這樣寫簡便一點:::
* top--;
* Object result = contents[top];
* contents[top] = null;*/
}
public Object peek() {
Object result;
if(isEmpty())
result = null;
else
result = contents[top-1];
return result;
}
public static void main(String[] args) {
ArrayStack stack = new ArrayStack();
System.out.println("將0到24依次壓棧,然后連續(xù)10次出棧");
for(int i = 0;i < 25;i++)
stack.push(i);
for(int i = 0;i < 10;i++)
stack.pop();
System.out.println("棧的大小為: " + stack.size());
System.out.println("棧為空嗎?: " + stack.isEmpty());
System.out.println("棧頂元素為: " + stack.peek());
}
}
運行結(jié)果:
將0到24依次壓棧,然后連續(xù)10次出棧
棧的大小為: 15
棧為空嗎?: false
棧頂元素為: 14
使用集合LinkedList來模擬棧
方法
java的泛型可以讓LinkedList模擬存儲各種數(shù)據(jù)類型的棧,包括int,double,String,Object等等,介紹一下幾種用到的API接口:
入棧
void addFirst(E e); // 將指定元素插入此列表的開頭
獲取棧頂元素
E getFirst(); // 返回此列表的第一個元素
出棧
E removeFirst(); // 移除并返回此列表第一個元素
判棧空
boolean isEmpty(); // 判斷???
示例代碼
import java.util.LinkedList;
import java.util.NoSuchElementException;
public class SimulateStack {
private LinkedList<Integer> stack = new LinkedList<Integer>();
public boolean isEmpty() {
return this.stack.isEmpty();
}
public void push(int data) {
this.stack.addFirst(data);
}
public int pop() throws NoSuchElementException{
return this.stack.removeFirst();
}
public int getTop() throws NoSuchElementException{
return this.stack.getFirst();
}
public static void main(String args[]) {
SimulateStack s = new SimulateStack();
s.push(1);
s.push(2);
s.push(3);
while (! s.isEmpty()) {
int data = s.getTop();
System.out.println(data);
s.pop();
}
}
}
- 利用數(shù)組實現(xiàn)棧(Java實現(xiàn))
- 淺談Java數(shù)組的一些使用方法及堆棧存儲
- Java中使用數(shù)組實現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)實例
- JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問題
- Java實現(xiàn)棧和隊列面試題
- java中棧和隊列的實現(xiàn)和API的用法(詳解)
- Java編程思想里的泛型實現(xiàn)一個堆棧類 分享
- Java使用Deque實現(xiàn)堆棧的方法
- java使用泛型實現(xiàn)棧結(jié)構(gòu)示例分享
- JAVA基于靜態(tài)數(shù)組實現(xiàn)棧的基本原理與用法詳解
相關(guān)文章
Springboot如何根據(jù)實體類生成數(shù)據(jù)庫表
這篇文章主要介紹了Springboot如何根據(jù)實體類生成數(shù)據(jù)庫表的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot+Vue項目部署上線的實現(xiàn)示例
本文主要介紹了SpringBoot+Vue項目部署上線的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-02-02
springboot2.2 集成 activity6實現(xiàn)請假流程(示例詳解)
這篇文章主要介紹了springboot2.2 集成 activity6實現(xiàn)請假完整流程示例詳解,本文通過示例代碼圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
聊聊springboot靜態(tài)資源加載的規(guī)則
這篇文章主要介紹了springboot靜態(tài)資源加載的規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java創(chuàng)建多線程局域網(wǎng)聊天室實例
這篇文章主要介紹了Java創(chuàng)建多線程局域網(wǎng)聊天室實例,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
Springboot整合微信支付(訂單過期取消及商戶主動查單)
本文主要介紹了Springboot整合微信支付(訂單過期取消及商戶主動查單),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
Mybatis?XML配置文件實現(xiàn)增刪改查的示例代碼
本文主要介紹了Mybatis?XML配置文件實現(xiàn)增刪改查的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-03-03

