1. 程式人生 > >堆,棧,佇列,沒有連結串列。

堆,棧,佇列,沒有連結串列。

堆,棧,佇列。

(1)堆:什麼是堆?又該怎麼理解呢?

①堆通常是一個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:

   ·堆中某個節點的值總是不大於或不小於其父節點的值;

   ·堆總是一棵完全二叉樹。

將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。

②堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。

③堆是應用程式在執行的時候請求作業系統分配給自己記憶體,一般是申請/給予的過程。

④堆是指程式執行時申請的動態記憶體,而棧只是指一種使用堆的方法(即先進後出)。

(2)(堆)

性質:LIFO後進先出

標頭檔案:

#include <stack>

定義:stack<int> s;

      Stack<string> s1;

操作:

入棧,如例:s.push(x);
出棧,如例:s.pop();注意,出棧操作只是刪除棧頂元素,並不返回該元素。
訪問棧頂,如例:s.top()
判斷棧空,如例:s.empty(),當棧空時,返回true
訪問棧中的元素個數,如例:s.size()

  • (stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。

(3)佇列:

性質:FIFO 先進先出

標頭檔案:#include<queue>

定義:queue<int> q1;
queue<double> q2;

優先佇列定義:

priority_queue<int> q1;
priority_queue< pair<int, int> > q2; // 注意在兩個尖括號之間一定要留空格。
priority_queue<int, vector<int>, greater<int> > q3; // 定義小的先出隊

priority_queue< int,vector<int>,greater<int> >//

注意空格!!

操作:入隊,如例:q.push(x); x 接到佇列的末端。
出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。
訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。
訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。
判斷佇列空,如例:q.empty(),當佇列空時,返回true
訪問佇列中的元素個數,如例:q.size()

特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。

建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。一個是隊頭指標front,它指向隊頭元素;另一個是隊尾指標rear,它指向下一個入隊元素的儲存位置。

(4):區別和聯絡:

1堆疊資料結構區別

堆(資料結構):堆可以被看成是一棵樹,如:堆排序。

棧(資料結構):一種先進後出的資料結構。

2堆、棧、佇列之間的區別是?

堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。

棧就是一個桶,後放進去的先拿出來,它下面本來有的東西要等它出來之後才能出來。(後進先出)

列只能在隊頭做刪除操作,在隊尾做插入操作.而棧只能在棧頂做插入和刪除操作。(先進先出)