1. 程式人生 > 遊戲 >國產燒腦解謎遊戲《籠中窺夢》今日發售 特價促銷

國產燒腦解謎遊戲《籠中窺夢》今日發售 特價促銷

目錄

一、定義

二、構造

  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

【轉載文章務必保留出處和署名,謝謝!】