資料結構整理 佇列和棧

2021-09-28 15:21:10 字數 2816 閱讀 6436

(這裡只談論迴圈佇列, 普通佇列空間浪費太嚴重)

建議使用類來封裝,因為stl中的queue和stack也都是封裝好的。

迴圈佇列反正是使用vector來實現的,畢竟能實現隨機訪問

頭指標尾指標(用來指向最後乙個元素的後乙個位置),還有乙個表示資料的數目。(由於空元素的存在,陣列實際的大小為該元素值 + 1——所有操作都要考慮這一點)

實現的幾個方法

佇列似乎沒什麼用,只有在bfs的時候才可以整。。不過哪怕這樣他也很有用了。

#include#includeusing namespace std;

templateclass mycircularqueue // cntr, 對vector進行resize是value-initialize

mycircularqueue(const mycircularqueue&) = default;

~mycircularqueue() = default;

// 下面只進行6個操作:入隊,出隊,判斷隊空,隊滿,獲得隊首,隊尾元素

// 判斷隊空

bool isempty()

// 判斷隊滿

bool isfull()

// 入隊

bool enqueue(const t &x)

data_[rear_] = x;

rear_ = (rear_ + 1) % (size_ + 1);

return true;

} // 出隊

bool dequeue()

head_ = (head_ + 1) % (size_ + 1);

return true; // 別忘了返回true

} // 獲得隊尾元素

t &getrear() // rear_始終指向最後乙個元素的後乙個位置

// 獲得隊首元素

t &getfront()

};int main()

// 這裡的boolalpha是用來控制把布林型變數輸出成false和true的

cout << boolalpha << my_queue->enqueue(4) << endl; // 這裡應該輸出false

cout << my_queue->getrear() << endl; // 應該輸出3

my_queue->dequeue();

my_queue->enqueue(4);

cout << my_queue->getrear() << endl; // 應該輸出4

return 0;

}

棧的實現特別簡單,因為出棧入棧都是在尾部進行操作的。

而這一點和動態陣列(指vector)如出一轍:push_back, pop_back。

stl為了實現演算法的高效性甚至都沒有給vector提供front方法。這點也和stack不謀而合。

棧只要實現四個方法就好了:

棧的用處似乎不這麼大,因為我們隨時可以編寫遞迴呼叫os的call stack。——當然要考慮溢位。

棧的用處似乎也特別大,因為有很多題目我們第一眼看就會想到棧。這是哪些題目呢?

比如說:從前往後遍歷,當遇到某乙個特殊元素時,處理前面的元素

在棧底的元素,優先順序都老低了;越往棧頂優先順序越高,碰到出棧訊號立刻出棧。

這些問題可以檢視我的leetcode部落格。

// 動態陣列和棧完美契合

// 你要知道vector是完全沒有在陣列最前面操作的方法的

// 但是其pop_back和push_back簡直完美

#include#includeusing namespace std;

templateclass stack

bool pop()

data_.pop_back();

return true;

} // 判斷棧是否為空

bool isempty()

// 獲取棧頂元素

// (像這種函式是無法判斷隊空的,除非使用特殊的約定;因為只能返回乙個型別)

t &top() // 我曹還真的有back方法啊

};int main()

cout << boolalpha << my_stack.isempty() << endl;

my_stack.pop();

cout << "棧頂元素:" << my_stack.top() << endl;

return 0;

}

你要知道棧和佇列都是封裝好了的,也就是說,你只能通過那幾個方法進行棧和佇列的操作。也就是說,你不能用for遍歷棧和佇列,包括resize等許多algorithm都不能使用。

遍歷和入棧的關係:以前的我總是隱隱約約地感覺遍歷和棧是一對矛盾。現在我有點弄懂了。通過遍歷,可以使更好的元素入棧。——啥意思?比如解析乙個算數表示式字串,碰到數字時,我總要把整個數字(而不是單個字元)入棧。如果拋開遍歷,還是採用棧來儲存該字串中的字元。那會特別麻煩(因為要不斷地反轉)

關於棧和佇列的數量:沒有什麼是乙個棧或者佇列解決不了的;如果有,那就兩個。

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...

資料結構 棧和佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...