從屌絲到架構師的飛越(數據結構篇)-堆棧

一.介紹

堆棧是一種數據結構,是只能在某一端插入和刪除的特殊線性表。它按照后進先出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據被第一個讀出來)。

  堆棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。 棧也稱為先進后出表(Last In First Out , 簡稱LIFO)。

比如:堆棧就是一個桶,后放進去的先拿出來,它下面本來有的東西要等它出來之后才能出來。

二.知識點介紹

1、堆棧原理

2、Stack使用

三.上課對應視頻的說明文檔

1、堆棧原理

(1) 一圖:當棧里面沒有任何元素的時候,為空棧,棧頂和棧底在同一個位置

(2) 二圖:當A元素進入我們的棧里面后,他所進入的過程叫入棧,棧底不變,棧頂為A元素的上部

(3) 三圖:在棧中加入B,C,D三個元素后,棧底不變,棧頂為D元素上部

(4) 四圖:D元素被移出,這個過程叫出棧,棧底不變,棧頂發生變化,棧頂為C元素的上部

2、Stack使用

public push(item) 把項壓入棧頂。其作用與 addElement (item ) 相同。

參數 item 壓入棧頂的項 。 返回: item 參數

public pop () 移除棧頂對象,并作為函數的值 返回該對象。

返回:棧頂對象(Vector 對象的中的最后一項)。

拋出異常 : EmptyStackException 如果堆棧式空的 。。。

public peek() 查看棧頂對象而不移除它。。

返回:棧頂對象(Vector 對象的中的最后一項)。

拋出異常 : EmptyStackException 如果堆棧式空的 。。。

public boolean empty (測試堆棧是否為空。)? 當且僅當堆棧中不含任何項時 返回 true,否則 返回 false.

public int search? (object o)? 返回對象在堆棧中位置, 以 1 為基數, 如果對象 o是棧中的一項,該方法返回距離 棧頂最近的出現位置到棧頂的距離; 棧中最上端項的距離為?。薄?。 使用equals 方法比較 o 與 堆棧中的項。。。?

案例:

import java.util.*;

public class StackTest{

public static void main(String args[]){

Stack s=new Stack();//產生一個空棧

s.push("A");

s.push("B");//入棧

s.push("C");

System.out.println(s.peek());//顯示棧頂的元素

//System.out.println(s.pop());//顯示棧頂的元素,并移出。

System.out.println(s);

System.out.println(s.search("A"));

Iterator i=s.iterator();

while(i.hasNext()){

System.out.println(i.next());

}

/*

while(!s.empty()){

System.out.println(s.peek());

}

System.out.println(s);

*/

}

}

案例:數組實現堆棧

public class ArrayOfStack {

private Object[] stack = null;

private int size;

private int top;

//默認初始化一個棧堆,大小為100

public ArrayOfStack(){

this.size = 100;

this.top = -1;

this.stack = new Object[size];

}

//初始化一個自定義大小的棧堆

public ArrayOfStack(int size){

this.size = size;

this.top = -1;

this.stack = new Object[size];

}

//判斷堆棧是否為空

public boolean isEmpty(){

if(top == -1){

return true;

}else

return false;

}

//判斷棧堆是否已滿

public boolean isFull(){

if(top == (size-1)){

return true;

}else

return true;

}

//入棧操作

public void push(String data){

if(isFull()){

System.out.println("堆棧已滿");

return;

}

//入棧開始,top相當于數組下標

top++;

stack[top] = data;

}

//出棧

public Object pop(){

//定義一個臨時對象

Object val = null;

//堆棧為空時報錯

if(isEmpty()){

System.out.println("堆棧為空");

return val;

}

//獲取堆棧值

val = stack[top];

top--;

return val;

}

//獲取棧頂元素

public Object peek(){

Object topVal = null;

if(isEmpty()){

System.out.println("棧堆為空!");

return topVal;

}

//取出棧頂元素

topVal = stack[top];

return topVal;

}

//獲取堆棧元素

public int size(){

return top+1;

}

//獲取棧堆容量

public int capcity(){

return size;

}

}

案例:鏈表實現堆棧

public class Node {

//鏈表數據域

Object data;

//鏈域

Node next;

//構造頭結點

public Node(){

this.data = null;

this.next = null;

}

//構造節點

public Node(Object data){

this.data = data;

this.next = null;

}

}

案例:堆棧類

public class LinkOfStack {

//定義一個頭結點

private Node head;

//構造頭結點

public LinkOfStack(){

head = new Node();

}

//判斷是否為空

public boolean empty(){

if(head.next == null)

return true;

else

return false;

}

//堆棧入棧

public void push(Object data){

Node item = new Node(data);

item.next = head.next;

head.next = item;

}

//出棧

public Object pop(){

Object item = null;

if(empty()){

System.out.println("堆棧為空");

}

item = head.next.data;

head.next = head.next.next;

return item;

}

//堆棧大小

public int size(){

int len = 0;

Node p = head;

while(p.next != null){

len++;

p = p.next;

}

return len;

}

//獲取棧頂元素

public Object peek(){

if(empty()){

System.out.println("堆棧為空");

}

return head.next.data;

}

public static void main(String[] args){

LinkOfStack stack = new LinkOfStack();

stack.push("測試鏈表堆棧節點一");

System.out.println(stack.size());

System.out.println(stack.peek());

while(!stack.empty()){

System.out.print(stack.pop()+"-->");

}

}

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容