適合新手的鏈棧程式碼

hello body發表於2020-11-15

鏈棧的實現

程式碼實現

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件


前言

提示:適合新手入門簡單粗暴。


提示:以下是本篇文章正文內容,下面案例可供參考

一、棧是什麼?

示例:先入後出。

二、程式碼

1.實現

程式碼如下(示例):

#include <iostream>## 棧
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef int ElemType;
typedef int Status;

/*結點的結構*/
typedef struct node
{
    ElemType data;
    struct node *next;
}Node;


/*棧的結構*/
typedef struct
{
    struct node *top;    //棧頂指標
    int count;           //用來記錄棧元素的個數
}Stack;

Status InitStack(Stack *s)
{
    if(NULL == s)
    {
        return -1;
    }

    s->top = NULL;    //棧空,棧頂指標指向NULL
    s->count = 0;
    return 0;
}

Status push(Stack *s, ElemType e)
{
    if(NULL == s)
    {
        return -1;
    }
    Node *p = (Node *)malloc(sizeof(Node));    //申請一個節點
    if(NULL == p)
    {
        return -1;
    }
    p->data = e;
    p->next = s->top;      //令新建立的節點指向當前的棧頂
    s->top = p;            //棧頂指標指向新壓棧的元素
    s->count++;
    return 0;
}

Status pop(Stack *s, ElemType *e)
{
    if(NULL==s || NULL==s->top)
    {
        return -1;
    }

    *e = s->top->data;        //取出棧頂元素的值
    Node *temp = s->top;      //儲存當前要出棧的棧頂元素的地址
    s->top = s->top->next;    //將棧頂指標移向下一個元素
    s->count--;
    free(temp);               //釋放當前棧頂元素的指標
    return 0;
}

int main(){
    Stack s;
    int e;
    InitStack(&s);
    push(&s,5);
    push(&s,6);
    push(&s,7);
    pop(&s,&e);
    printf("%d",e);
    return 0;
}

2.細節

程式碼如下(示例):

typedef struct node
{
    ElemType data;
    struct node *next;
}Node;

typedef struct
{
    struct node *top;    //棧頂指標
    int count;           //用來記錄棧元素的個數
}Stack;

要注意Node為棧每個節點的型別而Stack為整個棧的型別,通過對top指標的呼叫來
實現棧的各項操作

在這裡要是對連結串列很熟悉的話就可以知道push壓棧其實就是單連結串列裡面的頭插法
頭插法就是先入後出,只不過棧裡面只允許對top端進行操作

新手在不僅要關注棧具體操作演算法的實現,也要理解主函式裡面的* &
什麼時候用Stack *s,什麼時候用Stack s,什麼時候用&s。

Stack s;
push(&s,7);
pop(&s,&e);

總結

提示:想要真正瞭解棧和後面的佇列就要熟悉單連結串列的基本操作
對頭插法和尾插法建立單連結串列都要熟悉,在單連結串列的基礎上進而去了解棧的實現。

相關文章