資料結構之堆疊

2021-06-20 02:49:29 字數 3621 閱讀 1521

堆疊和佇列是兩種面向表的資料結構,它們都提供了易於理解的抽象。堆疊中的資料只能在表的某一端進行新增和刪除操作,反之佇列中的資料則在表的一端進行新增操作而在表的另一端進行刪除操作。堆疊被廣泛用於從表示式計算到處理函式呼叫的任何程式語言的實現中。而佇列則用在區分優先次序的作業系統處理以及模擬現實世界的事件方面,比如銀行出納櫃檯的佇列,以及建築物內電梯的操作。c#語言為使用這些資料結構提供了兩種類:stack 類和queue 類。

1.堆疊。堆疊是最頻繁用到的資料結構之一。這裡把堆疊定義為資料項的列表,而且這些資料項只能從表的末端進行訪問訪問。可訪問訪問的這端被稱為是棧頂。堆疊的標準模型是自助餐廳的盤子堆。人們始終要從頂部拿走盤子,而且當洗碗工或者雜工把盤子放回盤子堆的時候也是把它放在盤堆的頂部。堆疊是著名的後進先出(lifo)資料結構。堆疊最基本的兩種操作就是向堆疊內新增資料項以及從堆疊中刪除資料項。push(進棧)操作是向堆疊內新增資料項。而把資料項從堆疊內取走則用pop(出棧)操作。堆疊的另外一種基本操作就是察看棧頂的資料項。pop 操作會返回棧頂的資料項,但是此操作也會把此資料項從堆疊中移除。如果只是希望察看棧頂的資料項而不是真的要移除它,那麼在c#語言中有一種名為peek(取數)的操作可以實現。當然,此操作在其他語言和實現中可能採用其他的名稱(比如top)。進棧、出棧以及取數都是在使用堆疊時會執行的基本操作。但是,還有其他一些需要執行的操作以及需要檢查的屬性。從堆疊中移除全部資料項就是非常有用的操作。通過呼叫clear(清除)操作可以把堆疊全部清空。此外,在任何時候都能知道堆疊內資料項的數量也是非常有用的。這可以通過呼叫count(計數)屬性來實現。許多實現都有stackempty 方法。此方法會根據堆疊的狀態返回乙個真值或假值,但是也可以採用count 屬性達到同樣的目的。.net 框架的stack 類實現了全部這些操作和屬性,甚至還要更多。但是在討論如何使用它們之前,還是先來看看如果沒有stack 類,則需要如何實現乙個堆疊。

(1).stack 的實現需要採用一種潛在的結構來儲存資料。既然在新資料項進棧的時候不需要擔心調整表的大小,所以這裡選擇用arraylist。因為c#語言擁有如此強大的物件導向的程式設計特徵,所以這裡將把堆疊作為乙個類來實現。此類被稱為是cstack。這裡還會包括乙個構造器方法以及有關上述提及操作的方法。為了說明在c#語言中實現的過程,count 屬性會作為一種屬性來實現。所需要的最重要的變數就是用來儲存堆疊資料項的arraylist 物件。除此以外,另乙個也需要關注的資料就是棧頂。這裡將用乙個簡單的整型變數來處理以便提供類似索引的功能。當對乙個新的cstack 物件例項化時,會把此變數的初始值設為-1。每次把新的資料項壓入堆疊時,變數就會自加1。構造器方法只完成對索引變數初始化為-1 的操作。第一種實現的方法是push。程式呼叫arraylsit 的add 方法,並且把傳遞給它的數值新增到arraylist 裡面。pop 方法完成三件事:呼叫removeat 方法來取走棧頂的資料項(脫離arraylist),索引變數自減1 操作,以及最終返回出棧的物件。peek 方法是通過呼叫含有索引變數作為引數的item 方法來實現的。clear 方法則簡單地呼叫arraylist 類中同樣的方法。既然不需要突發改變堆疊上資料項的數量,所以這裡把count屬性寫為唯讀的屬性。**如下所示:

[csharp]view plain

copy

class

cstack  

public

intcount  

}  public

void

push(

object

item)  

public

object

pop()  

public

void

clear()  

public

object

peek()  

}  利用回文測試如下

[csharp]view plain

copy

static

void

main(

string

args)  

pos++;  

}  if

(ispalindrome)  

console.writeline(word + " is a palindrome."

);  

else

console.writeline(word + " is not a palindrome."

);  

console.read();  

}  

(2).對堆疊最主要的操作就是push 和pop。用push 方法把資料新增到堆疊裡面。用pop 方法把資料從堆疊中移除。下面通過用堆疊來計算簡單的算術表示式的例項來了解一下這些方法。

[csharp]view plain

copy

using

system;  

using

system.collections;  

using

system.text.regularexpressions;  

namespace

csstack  

// isnumeric isn't built into c# so we must define it

static

bool

isnumeric(

string

input)  

quot;);  

regex validate = new

regex(pattern);  

if(!validate.ismatch(input))  

return

flag;  

}  static

void

calculate(stack n, stack o, 

string

exp)  

}  else

if(ch == 

"+"|| ch == 

"-"|| ch == 

"*"|| ch == 

"/")  

o.push(ch);  

if(n.count == 2)  

compute(n, o);  

}  }  

static

void

compute(stack n, stack o)  

}  }  }  

(3).堆疊常用方法。

peek 方法。peek 方法會讓人們在不把資料項移出堆疊的情況下看到棧頂資料項的值。

clear 方法。clear 方法會把所有資料項從堆疊內移除,並且把資料項計數器設定為零。

contains 方法。contains 方法用來確定指定的元素是否在堆疊內。如果找到該元素,那麼此方法會返回true;否則就返回false。

copyto 方法。copyto 方法會把堆疊內的內容複製到乙個陣列中。陣列必須是object 型別,因為這是所有堆疊物件的資料型別。此方法會取走兩個引數:乙個陣列和開始放置堆疊元素的陣列的起始索引。堆疊內元素按照lifo 的順序進行複製操作,就好像對它們進行出棧操作一樣。

toarray 方法。toarray 方法的工作原理與copyto 方法類似。但是使用者無法指定陣列的起始索引位置,而是需要在賦值語句中建立新的陣列

**:

資料結構之堆疊

棧是一種只能在一端進行插入或刪除操作的線性表。表中允許進行插入 刪除操作的一端稱為棧頂。棧頂的當前位置是 動態的,棧頂的當前位置由乙個稱為棧頂指標的位置指示器指示。表的另一端稱為棧底。當棧中沒有資料元素時,稱為空 棧。棧的插入操作通常稱為進棧或入棧,棧的刪除操作通常稱為退棧或出棧。怎麼理解堆疊呢?比...

資料結構之堆疊

定義 堆疊 stack 代表了乙個 後進先出 的物件集合。當您需要對各項進行後進先出的訪問時,則使用堆疊。當您在列表中新增一項,稱為推入元素,當您從列表中移除一項時,稱為彈出元素。stack類的方法和屬性 類成員說明 count 獲取 stack 中包含的元素個數。clear 從 stack 中移除...

資料結構(java)之堆疊

首先需要知道的是棧有先進後出的特性 1.棧的介面類 public inte ce stack2.棧介面的實現類 public class arraystackimplements stack public arraystack 獲取棧的長度 override public int getsize 判...