###王道考研的學習領悟,個人喜好講解清晰
何為棧??
定義:棧(stack)是只允許在一端進行插入或刪除的線性表。
其重要術語:棧頂,棧底,空棧。
?我們只需要把這個圖看明白了,理解起來就很快。
在這次的棧實現中,我們會運用到類似順序表的定義法,舉個例子:
Elemtype *data; == Elemtype data[Maxsize];
在實際的代碼操作中,指針與數組其實是等效的,指針指向一塊申請的堆空間,而數組存在棧空間
所以,我們在對于順序棧的聲明時,可以看作是對順序表的一次結構體聲明。?
對于每個數據結構,我們都要反問自己三要素
數據結構 | 順序表 | 順序棧 |
邏輯結構 | 結點相連,連續空間 | 結點相連,連續空間 |
物理結構 | 連續空間 | 連續空間 |
數據的運算/基本操作 | 可直接讀取所有元素 | 只能快速讀取棧頂元素 |
?
所以我們開始吧。
棧的定義(Stack):
一.棧的定義&初始化
#include <stdio.h>#define MAXSIZE 10 //這里我就定義它有10個連續空間
typedef int Elemtype;typedef struct{Elemtype data[MAXSIZE]; //靜態數組存放棧的元素int top; //棧頂指針--->一直指向棧頂}SqStack;//聲明一個棧//初始化棧
bool InitStack(SqStack &s){s.top = -1; //將棧的指針設為空return true;
}
補充一個小知識:如果我們使用---整型來定義數據結構的指針時,我們會使用 -1 來表示它此時指向為空,就相當于我們利用指針類型來定義的 中的NULL,空指針一樣。
-2可以表示為該空間暫時空閑。 其實我們也可將 s.top = 0; 這是另一種設法,后面的操作又會需要改變一些細節。這里我們用常用的設法來進行棧的操作定義吧。
二.判斷棧是否為空棧
//判斷是否為空棧, 只要指針指向的為 -1 初始定義時,就可以認為是空棧
bool IsEmpty{SqStack s)
{if (s.top == -1){return true; //此時棧頂指針指向空}else{return false;}}
三.棧的入棧(push)
//棧的入棧,這里我會告訴你兩種表示法,選擇你喜歡的哪一個//@操作1
bool Push1(SqStack &s,Elemtype e)
{if (s.top == MAXSIZE-1){return false; //判斷是否滿棧了}s.top = s.top + 1; //先把指針指向下一個棧頂s.data[top] = e; //再把目的數值賦給當前的棧頂return true;}//@操作二 ++a 的意思是,先進行a = a + 1的操作并把結果返回給操作中bool Push2(SqStack &s,Elemtype e)
{if (s.top == MAXSIZE-1){return false; //目的與操作一相同}s.data[++s.top] = e; //相當于把 操作1中的--- 1.指針加1 2.棧頂賦值 結合在一起寫return true;
}
入棧就是先把 棧頂指針加一位,指向沒有值的棧頂,再通過數組的快速尋值【address】-
--> s.data[top] = e ,將 元素e賦給當前的棧,便完成了入棧操作。
四.棧的出棧
//棧的出棧//也有兩個出棧寫法
bool Pop1(SqStack &s,Elemtype &e)
{ if (s.top == -1){return false; //如果為空棧的話}//這時先把棧頂的值先拿出來e = s.data[s.top];s.top = s.top - 1;return true;
}//出棧寫法二 a-- 先完成該操作后 然后再進行 減1
bool Pop1(SqStack &s,Elemtype &e)
{if (s.top == -1){return false; //如果為空的話}e = s.data[s.top--];return true;
}
五.讀取棧頂元素
//獲取棧頂元素
bool GetElem(SqStack s,Elemtype &e)
{if (s.top == -1){return false; //若為空,返回錯}e = s.data[s.top];return true;
}
六.改變棧頂的值
//改變棧頂的值bool ChangeNode(SqStack &s,Elemtype e)
{if (s.top == -1){return false;}s.data[s.top] = e;return true;
}
七.讀取棧里的所有值
//無返回值
void PrintAll(SqStack s)
{while( s.top != -1){printf("%d",s.data[s.top]);}}
以上就是基本的該棧的基本操作,感謝你的觀看。