棧

基本概念

  棧作爲一種數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。它按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指針。
  棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱爲棧頂(top),另一端爲棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數爲零時稱爲空棧。插入一般稱爲進棧(PUSH),刪除則稱爲退棧(POP)。棧也稱爲後進先出表。
  棧可以用來在函數調用的時候存儲斷點,做遞歸時要用到棧!
  以上定義是在經典計算機科學中的解釋。
  在計算機系統中,棧則是一個具有以上屬性的動態內存區域。程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在i386機器中,棧頂由稱爲esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。
  棧在程序的運行中有着舉足輕重的作用。最重要的是棧保存了一個函數調用時所需要的維護信息,這常常稱之爲堆棧幀或者活動記錄。堆棧幀一般包含如下幾方面的信息:
  1. 函數的返回地址和參數
  2. 臨時變量:包括函數的非靜態局部變量以及編譯器自動生成的其他臨時變量。

基本算法

  1.進棧(PUSH)算法
  ①若TOP≥n時,則給出溢出信息,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢出;不滿則作②);
  ②置TOP=TOP+1(棧指針加1,指向進棧地址);
  ③S(TOP)=X,結束(X爲新進棧的元素);
  2.退棧(POP)算法
  ①若TOP≤0,則給出下溢信息,作出錯處理(退棧前先檢查是否已爲空棧, 空則下溢;不空則作②);
  ②X=S(TOP),(退棧後的元素賦給X):

  ③TOP=TOP-1,結束(棧指針減1,指向棧頂)。

 

 

 

Java自定義棧的實現

 

棧是一種重要的數據結構,廣泛應用於我們的編程之中,例如多項式求值、平衡輸入和方法的調用等。我們都知道,在java中定義了一個Stack類,但現在,我們不使用這個,而是自己定義一個Stack類,來了解一下棧的一些基本操作及特點。代碼如下:

//  Stack.java

package org.mdy;
public class Stack{
 private int top=-1;  //棧頂指針
 private Object [] item;  //用Object類存放入棧的數據
 private int size=0;   //棧已存數據的長度
 private int capacity=10;  //棧的初始化容量
 private int increament=5;  //棧的增量

 public Stack(){
  this.item=new Object[capacity];
 }

 public void push(Object obj){                               //入棧操作
  if(capacity==size){     //若棧已存滿,則增加棧的容量大小
   capacity+=increament;
   Object[] newitem=new Object[capacity];
   for(int i=0;i<size;i++){
    newitem[i]=item[i];
   }
   item=newitem;
  }
   item[top+1]=obj;
   size++;
   top++;
 }

 public Object pop(){                      //出棧操作
  Object obj=null;
  if(top>-1){
   obj=item[top];
  top--;
  size--;
  }else{
   System.out.println("棧已爲空!!");
  }
  return obj;
 }

 public int getSize(){                                 //得到棧已存數據的長度
  return this.size;
 }
}

下面定義一個類來測試一下:

//MyStack.java

import org.mdy.Stack;
public class MyStack{
 public static void main(String args[]){
  Stack sk=new Stack();
  for(int i=0;i<13;i++){     //將0-12入棧
   sk.push(i);
  }
   int len=sk.getSize();
  for(int i=0;i<len;i++){                  //輸出棧中數據
   System.out.print(sk.pop()+"   ");  

  }

 

發佈了24 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章