教你怎么用Java數(shù)組和鏈表實現(xiàn)棧
一、何為棧?
棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出?;蛲藯?,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
??梢灶惐瘸涩F(xiàn)實生活中的彈夾或者羽毛球桶

二、用數(shù)組實現(xiàn)棧
用數(shù)組模擬棧的思路分析如圖:

1.定義一個top變量(指針)表示棧頂初始化為-1.
2.定義一個變量來記錄棧的大小。
3.入棧操作有數(shù)據(jù)加入到棧中:top++; arr[top]=value;
4.出棧操作: int value=arr[top]; top–; return value;
下面看完整代碼示例:
class Stack{
public int maxsize;//棧的大小
public int top=-1;//棧頂
public int[] arr;
public Stack(int maxsize) {
this.maxsize = maxsize;
arr=new int[maxsize];
}
//判斷棧是否為空
public boolean isEmpty(){
return top==-1;
}
//判斷棧是否滿
public boolean isFull(){
return top==maxsize-1;
}
//添加一個元素
public void push(int value){
if(isFull()){
throw new RuntimeException("棧滿");
}
top++;
arr[top]=value;
}
//彈出一個元素
public int pop(){
if(isEmpty())
throw new RuntimeException("???);
int value=arr[top];
top--;
return value;
}
//遍歷棧中的元素
public void traverse(){
if (isEmpty()){
return;
}
//需要從棧頂開始顯示數(shù)據(jù)
for(int i = top; i >= 0 ; i--) {
System.out.printf("stack[%d]=%d\n", i, arr[i]);
}
}
}
入棧操作 top++;arr[top]=value;其實可以直接改寫為arr[++top]=value;
出棧操作可以將 int value=arr[top]; top–;return value;改為return arr[top–];
三、鏈表實現(xiàn)棧
思路分析:
入棧操作:用一個臨時節(jié)點保存當(dāng)前棧頂節(jié)點,將入棧的新節(jié)點作為棧頂元素,并將next域指向原來的舊節(jié)點。 Node temp=top; top.setNext(temp);
出棧操作:先判斷棧是否為空,不為空則將top節(jié)點的數(shù)據(jù)返回,并將top指向top的下一個next域:top=top.getNext();
public class LinkedListStack<V> {
static class Node<V>{
private V data;
private Node<V> next;
public V getData() {
return data;
}
public void setData(V data) {
this.data = data;
}
public Node<V> getNext() {
return next;
}
public void setNext(Node<V> next) {
this.next = next;
}
}
public int stackSize;//棧內(nèi)元素的個數(shù)
public Node<V> top;//棧頂元素
public LinkedListStack() {
stackSize = 0;
top = null;
}
//入棧
public void push(V element){
Node<V> temp=top;
top=new Node<>();
top.setData(element);
top.setNext(temp);
stackSize++;
}
//出棧
public V pop(){
if (isEmpty())
throw new RuntimeException("empty stack");
V value=top.getData();
//棧頂指向下一個元素
top=top.getNext();
stackSize--;
return value;
}
//查看棧頂元素
public V peek(){
return top.getData();
}
//判斷是否為空
public boolean isEmpty(){
return stackSize==0;
}
//查看棧內(nèi)元素個數(shù)
public int getStackSize(){
return stackSize;
}
}
四、測試
public class Test {
public static void main(String[] args) {
LinkedListStack<String> stack = new LinkedListStack<>();
stack.push("a");
stack.push("b");
stack.push("c");
System.out.println(stack.pop());
System.out.println(stack.peek());
System.out.println(stack.getStackSize());
}
}
測試結(jié)果:
c
b
2
到此這篇關(guān)于教你怎么用Java數(shù)組和鏈表實現(xiàn)棧的文章就介紹到這了,更多相關(guān)Java數(shù)組和鏈表實現(xiàn)棧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用
堆是一顆完全二叉樹,在這棵樹中,所有父節(jié)點都滿足大于等于其子節(jié)點的堆叫大根堆,所有父節(jié)點都滿足小于等于其子節(jié)點的堆叫小根堆,堆雖然是一顆樹,但是通常存放在一個數(shù)組中,父節(jié)點和孩子節(jié)點的父子關(guān)系通過數(shù)組下標(biāo)來確定2021-10-10
使用Springboot自定義轉(zhuǎn)換器實現(xiàn)參數(shù)去空格功能
這篇文章主要介紹了使用Springboot自定義轉(zhuǎn)換器實現(xiàn)參數(shù)去空格功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
在Java中實現(xiàn)可見性(visibility)的主要方法詳解
這篇文章主要介紹了在Java中實現(xiàn)可見性(visibility)的主要方法詳解,在Java中,使用關(guān)鍵字volatile和使用鎖(如synchronized關(guān)鍵字或 java.util.concurrent包中的鎖)來確保對共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下2023-08-08
Intellij無法創(chuàng)建java文件解決方案
這篇文章主要介紹了Intellij無法創(chuàng)建java文件解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
SpringMVC @RequestMapping注解作用詳解
通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01

