基礎資料結構----ST表
目錄
一、定義
二、構造
1、具象形狀
2、建棧
3、入棧
4、出棧
5、檢視棧頂元素
6、判斷棧是否為空
7、棧的大小
三、結尾
定義
-
一種資料結構
-
一種特殊的線性表
-
遵循先進後出(First In Last Out)原則
構造
- 注:本文兼併STL模板與手打
不想看俺BB可向下跳
具象形狀
棧就相當是一堆壘起來或者是將要壘起來的書
當我們只有一隻手(另一隻手不知道在幹什麼)時,我們想要穩穩的拿書,一定不可能從底下開始,或者是中間開始拿書吧?(不管你可不可以,反正我沒那技術)
所以我們需要從頂部開始拿書,我們從頂部開始拿書的原因不就是想要將書壘起來嗎?
所以我們計算機也提供了棧給我們試試壘書和拿書的過程。
正片開始
建棧
我們既然要將“書”壘起來,那我們就需要位置來給我們壘起書。
要用棧也是同樣的道理,我們需要先建棧。
- STL版
用C++自帶的STL(標準模板庫)是非常簡單的。
我們只需要引入棧對應的stack庫建立即可。
#include <stack>
using namespace std;
stack< /*資料型別*/ > /*變數名*/;
// 如:
#include <stack>
using namespace std;
stack<int> S;
// 另一種寫法 #include <stack> std::stack< /*資料型別*/ > /*變數名*/; //如: #include <stack> std::stack<int> S;
- 手寫版(陣列寫法)
絕不會告訴你我只會陣列的模擬
const int N = /*資料大小(根據題目修改)*/;
/*資料型別*/ stack[N]; // 資料存放的地點
int top = 0; // 棧頂指標
// 如:
const int N = 100001;
int S[N];
int top = 0;
入棧
既然用來讓我們“壘書”的地方建好了,那麼我們就要開始“壘書”了。
- STL版
stack庫給我們打包好了一個叫做 push() 的入棧函式,可以讓我們將同樣型別的資料丟到棧裡面。
我們上面定義的棧是int型別的,所以我們丟到棧裡面的元素也應該是int型別的,如果用了不同型別的變數元素,程式會報錯。
int a;
S.push(a);
- 手寫版(陣列寫法)
我們要將資料放入棧裡,那麼棧的大小會增大,棧頂的高度會上升。
void push(int a) {
++top;
S[top] = a;
}
出棧
誒,書的順序錯了?
不要緊,我們可以從頭上一本一本地拿開,知道看到順序錯誤的那本書。
- STL版
同樣,stack庫給我們打包好了一個叫做 pop() 的出棧函式,可以讓我們將棧最上面的元素丟出來,也就是把棧頂彈出。(棒打出頭鳥)
所以我們只要一句話就可以將棧頂提走,灰常高冷。
S.pop();
- 手寫版(陣列寫法)
我們把棧頂的元素丟出去,意味著棧的大小變小了,所以手寫的出棧函式就只有一句話。
void pop() {
--top;
}
檢視棧頂元素
我們可以將書從最頂端拿走,也可以檢視最頂端的書。
同樣的,我們也可以檢視棧頂的元素。
- STL版
stack庫提供給我們一個叫做 top() 的函式,可以檢視棧頂的元素。
int a = S.top();
printf("%d", a);
或者是
printf("%d", S.top());
- 手寫版(陣列寫法)
我們一開始定義了top為棧頂指標,每次入棧時自增1(++top),每次出棧時自減1(--top),所以top儲存的數字是棧頂元素在陣列中的位置,所以top()函式相當於返回陣列的第top個元素。
int top() {
return S[top];
}
int main (void) {
...巴拉巴拉...
printf("%d", top());
...巴拉巴拉...
}
判斷棧是否為空
在現實中我們“壘書”,有壘沒壘是一目瞭然的,but在我們的程式裡我們不一定看得出來。
所以我們需要判斷一下我們壘起來的“書”是不是空的。
- STL版
stack庫提供給我們一個叫做 empty() 的函式,當棧是 空的 的時候,這個函式會返回一個true給我們;當棧不是 空的 的時候,函式會返回一個false給我們。
一般來說,我們判斷是否為空的返回值為bool值,為了好看,我一般會用文字的方式來測試。
if (S.empty()) {
printf("沒有東西哦~");
}
else {
printf("有點東西哦~");
}
- 手寫版(陣列寫法)
我們一開始定義了一個名為top的棧頂指標,它的初始值為0,所以我們判斷棧是否為空的時候,判斷top與0的關係即可。
bool empty() {
return (top == 0); // 如果top == 0返回true,否則返回false。
}
int main(void) {
...巴拉巴拉...
if (empty()) {
printf("沒有東西哦~");
}
else {
printf("有點東西哦~");
}
...巴拉巴拉...
}
棧的大小
在現實中我們“壘書”,壘了幾本書是一目瞭然的(吧?),but在我們的程式裡我們不一定看得出來。
所以我們需要檢視一下我們壘起來的“書”有幾本。
- STL版
stack庫提供給我們一個叫做 size() 的函式,可以返回棧裡面元素的個數。
printf("%d", S.size());
- 手寫版(陣列寫法)
我們一開始定義了top為棧頂指標,每次入棧時自增1(++top),每次出棧時自減1(--top),所以top同時也儲存了棧裡面元素的數量。
int size() {
return top;
}
結尾
用STL寫的棧 與 用手打的棧 各有千秋,一般來說,沒有吸氧(開\(O2\)優化)的話,用手打的棧比用STL寫的棧來的快;吸氧(開\(O2\)優化)的話,兩者時間差不多。
而且單說打比賽的話,從CSP到NOIP,是不可以開O2優化(2021年開啟了吸氧時代,所以當我沒說)的,所以總體上是手打棧快。
所以我選擇STL!!!!!
因為STL打的快啊!!!!!(懶人必備神器)
部落格園:https://www.cnblogs.com/Juro/
Copyright ©2021 Juro
【轉載文章務必保留出處和署名,謝謝!】