【C++複習】棧-上篇

Yinph發表於2024-11-16

大家好,這裡是不會寫開場白的Yinph。

我們直接進入正題,開始進行C++的複習——棧:

一、什麼是棧?

棧,又名堆疊(stack)。作為一種特殊的資料結構,它是一種只能在一端進行插入和刪除操作的特殊線性表

想象一下,我們用一個大箱子來堆積物品,先堆進來的壓在最底下,隨後一件件物品往上堆。而取走時,也只能從最上面開始拿。棧也是如此,它就是一種類似箱子堆積物品的資料結構,先放最晚拿,後放最早拿

箱子(棧)的最上面我們稱之為棧頂(top),允許插入(push)和刪除(pop),刪完了,也就是棧底就是棧頂的時候,就叫空棧。而最下面稱之為棧底(Bottom),什麼也不能幹。

一個簡單的口訣:“先進後出,後進先出。”

進棧與出棧

然而,在進棧前首先要檢查棧是否已滿,滿則溢位;而退棧前也要先檢查是否為空棧,空則下溢。

因為棧空間是有限的,如果棧已滿,在進行入棧操作時,就會產生“上溢”。上溢將使程式無法繼續執行,我們要想辦法避免。而對於出棧操作中的“下溢”,程式中僅會給出一個標誌資訊,我們無需過度在意。

二、棧的常用操作

棧的常用操作有:入棧(push)、出棧(pop)、取棧頂元素(top)、判斷棧是否為空(isEmpty)、清空棧(clear)獲取棧內元素個數(size)。

(1)陣列模擬棧

由於計算機中沒有棧這種儲存結構,我們可以用順序儲存結構——陣列來模擬棧。具體如下:

首先,我們可以定義一個全域性陣列st,作為棧的儲存結構,並將棧頂指標TOP初始化為0。接下來,我們可以定義一些函式,用於模擬棧的操作。

入棧:將元素壓入棧頂,棧頂指標top加1,將元素儲存在top指向的位置。

出棧:將棧頂元素彈出,棧頂指標top減1。

取棧頂元素:獲取棧頂指標top指向的元素。

判斷棧是否為空:判斷棧頂指標top是否為-1。

清空棧:將棧頂指標top置為-1。

獲取棧內元素個數:獲取棧頂指標top的值。

接下來,我們用程式碼來解決一些問題:

我們可以嘗試將整數1、2、3、4、5入棧,接著輸出此時的棧頂,最後輸出棧內所有的元素。

#include <iostream>
using namespace std;

int st[n+1]; // n為元素個數,建立陣列時長度比元素個數多1	
int TOP = 0; // 從陣列下標為1的位置開始存放資料,棧空時,TOP=0

void push(int x)//入棧
{	
    TOP++;	
    st[TOP] = x;	
}
void pop( ) //出棧
{	
    TOP--;	
}
int top( ) // 獲取棧頂元素	
{	
    return st[TOP];	
}
bool isempty( ) //判斷棧是否為空	
{
    return TOP == 0;	
}
void clear( ) //清空
{
    TOP = 0;	
}
int size( ) // 獲取棧內元素個數
{
    return TOP;	
}

int main()
{
    for (int i = 1; i <= 5; i++)
    {
      push(i); // 入棧
    }
    cout << "當前棧頂元素為:" << top() << endl;
    cout << "出棧順序為:" << size() << endl;
    while (!isempty()) // 判斷棧是否為空
    {
      cout << top() << " ";
      pop(); // 出棧
    }
    return 0;
}

(2)使用標準模板庫(STL)

標準模板庫(STL),是一些常用資料結構(棧、佇列等)和演算法(sort、swap等)的模板的集合。有了STL,不必再寫太多的標準資料結構和演算法,並且效能也會更高。

除了用順序儲存結構——陣列模擬棧之外,STL也提供了棧的模板類,可以直接使用,非常方便。

標頭檔案:#include <stack>

定義:stack<資料型別> 棧名;

例如:stack<int> s;

棧(stack)常用函式:

push(x):將x入棧

pop():彈出棧頂元素

top():獲得棧頂元素

empty():檢測棧是否為空,返回true為空,false為非空。常與if語句連用,例如if (s.empty())

size():獲取棧中元素個數(可理解為總長度)

以一張圖即可理解:

棧的常用函式

同樣的問題,我們用STL來解決一下:

#include <iostream>
#include <stack> // 標頭檔案
using namespace std;

int main()
{
    stack<int> s; // 定義一個棧
    for (int i = 1; i <= 5; i++)
    {
      s.push(i); // 入棧
    }
    cout << "棧頂元素為:" << s.top() << endl;
    cout << "棧內元素個數為:" << s.size() << endl;
    while (!s.empty()) // 判斷棧是否為空
    {
      cout << s.top() << " "; // 輸出棧頂元素
      s.pop(); // 出棧
    }
    return 0;
}

三、總結一下

棧是一種先進後出的資料結構,它只能在一端進行插入和刪除操作。在C++中,我們可以使用陣列STL中的stack模板類來模擬棧的操作。棧的常用操作包括入棧、出棧、取棧頂元素、判斷棧是否為空、清空棧和獲取棧內元素個數。

希望這篇文章能幫助你們更好地理解棧,如果你有任何問題,歡迎在評論區留言。

OK,以上就是今天要講的內容。大家喜歡就點個贊吧,我會盡快更新!ヾ(•ω•`)o!