本文原文連結
棧是線性結構的常見應用,是一種可以實現"先進後出"的儲存結構,?:讓我們想一下箱子?,往?裡面放東西,最先放入?中的東西被放在底部,後放入的反而在上面,假設我們從上至下的拿東西,那麼就是先放入的後出,後放入的先出,即這就是一個"先入後出"的儲存結構。
棧的應用非常的廣泛:函式呼叫、中斷、表示式求值、記憶體分配、快取、迷宮都有應用棧的知識。
棧和佇列實現雖然不同,但都可以通過陣列和連結串列實現,棧分為靜態棧和動態棧,靜態棧有陣列構成,動態棧有連結串列構成。
其中的核心操作就是:壓棧和出棧。壓棧就是放入棧中,出棧就是拿出棧中。下面我們看看棧的基本結構:
棧頂Top 棧底Bottom
? ?
[data|next]——>[data|next]——>[data=NULL|next]——> NULL
複製程式碼
確認一個棧只需要兩個引數,棧頂Top和棧底Bottom,初始建立時,棧頂Top等於棧底Bottom;壓棧時,棧頂Top移動;出棧時,還是棧頂Top移動。
#C語言棧實現
首先我們先來做好初始化的準備:
// 連結串列元素結構體
typedef struct Node {
int data;
struct Node * next;
}Node, *pNode;
// 棧的引數
typedef struct Stack {
pNode pTop; // 棧頂
pNode pBottom; // 棧底
}Stack, *pStack;
// 初始化
void initStack(pStack s);
// 壓棧
void pushStack(pStack s, int value);
// 遍歷
void traverseStack(pStack s);
// 出棧
bool popStack(pStack s);
複製程式碼
以上就是棧的基本操作,下面是函式的實現
// 初始化
void initStack(pStack s) {
s->pTop = (pNode)malloc(sizeof(Node));
if(s->pTop == NULL) {
printf("記憶體分配失敗");
exit(-1);
}
s->pBottom = s->pTop;
s->pTop->next = NULL;
}
// 壓棧
void pushStack(pStack s, int value){
pNode pNew = (pNode)malloc(sizeof(Node));
if(pNew == NULL) {
printf("記憶體分配失敗");
exit(-1);
}
s->pTop = pNew;
pNew->data = value;
pNew->next = s->pBottom;
}
// 遍歷
void traverseStack(pStack s){
pNode top = s->pTop;
while(top->next != NULL){
peintf("%d\n", top->data);
top = top->next;
}
}
// 出棧
bool popStack(pStack s){
pNode node = s->pTop;
if(node->next != NULL){
return false;s
}
s->pTop = s->pTop->next;
free(node);
retrun false;
}
複製程式碼
main函式中建立呼叫棧:
int main() {
// 建立棧
Stack s;
initStack(&s);
pushStack(&s, 1);
pushStack(&s, 2);
pushStack(&s, 3);
pushStack(&s, 4);
traverseStack(&s);
popStack(&s);
traverseStack(&s);
return 0;
}
複製程式碼
參考:
ps: 微信公眾號:Yopai,有興趣的可以關注,每週不定期更新。不斷分享,不斷進步