大家好,這裡是不會寫開場白的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!