棧是線性結構的常見應用,是一種能夠實現"先進後出"的存儲結構,🌰:讓咱們想一下箱子📦,往📦裏面放東西,最早放入📦中的東西被放在底部,後放入的反而在上面,假設咱們從上至下的拿東西,那麼就是先放入的後出,後放入的先出,即這就是一個"先入後出"的存儲結構。node
棧的應用很是的普遍:函數調用、中斷、表達式求值、內存分配、緩存、迷宮都有應用棧的知識。git
棧和隊列實現雖然不一樣,但均可以經過數組和鏈表實現,棧分爲靜態棧和動態棧,靜態棧有數組構成,動態棧有鏈表構成。github
其中的核心操做就是:壓棧和出棧。壓棧就是放入棧中,出棧就是拿出棧中。下面咱們看看棧的基本結構:數組
棧頂Top 棧底Bottom
👇 👇
[data|next]——>[data|next]——>[data=NULL|next]——> NULL
複製代碼
確認一個棧只須要兩個參數,棧頂Top和棧底Bottom,初始建立時,棧頂Top等於棧底Bottom;壓棧時,棧頂Top移動;出棧時,仍是棧頂Top移動。緩存
首先咱們先來作好初始化的準備:bash
// 鏈表元素結構體
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;
}
複製代碼
代碼示例:C語言建立棧app
參考:ide
ps: 微信公衆號:Yopai,有興趣的能夠關注,每週不按期更新。不斷分享,不斷進步