1. 程式人生 > >資料結構學習筆記-棧的鏈式儲存(C語言實現)

資料結構學習筆記-棧的鏈式儲存(C語言實現)

棧是一個特殊的線性表,後進先出,既然是線性表,就會分為順序儲存和鏈式儲存,下面就是棧的鏈式儲存部分,也稱作鏈棧。單鏈表是有頭指標頭節點的,通常鏈棧的棧頂就相當於頭指標,因為初始化的鏈棧是空的,即top=NULL,因為棧頂的存在,單鏈表的頭節點就沒什麼意義了,也就不需要了。對於鏈棧來說,幾乎不存在棧滿的情況,除非電腦記憶體滿了。鏈棧的操作和單鏈表的操作非常相似,只是插入、刪除、獲取區別較大,實現程式碼如下:

#include <stdio.h>
#include <stdlib.h>
typedef int LSEletype;//定義鏈棧儲存的資料型別
typedef struct StackNode{//定義鏈棧儲存的結構體(節點)
    LSEletype data;
    struct StackNode *next;
}StackNode;
typedef StackNode *StackLinkP;//定義指標型別的棧頂(相當於連結串列的頭指標)
typedef struct StackLink{//定義鏈棧的屬性
    StackLinkP top;
    int count;
}StackLink;
StackLink init(){
    StackLink sl;
    sl.top=NULL;
    sl.count=0;
    return sl;
}
int stackEmpty(StackLink s){
    int result;
    if(s.count==0){
        result=0;
    }else{
        result=1;
    }
    return result;
}
void push(StackLink *s,LSEletype e){
    //定義一個指向節點的指標(相當於連結串列頭指標)
    StackLinkP p;
    //通過指標建立節點並賦值
    p=(StackLinkP)malloc(sizeof(StackNode));
    p->data=e;
    p->next=s->top;//把棧頂的指向給他再讓棧頂指向他
    s->top=p;
    s->count++;//鏈棧長度自增
}
void pop(StackLink *s,LSEletype *e){
    int r=stackEmpty(*s);//判斷該棧是否為空
    if(r==1){
        StackLinkP p=s->top;//拿到要刪除的節點
        (*e)=p->data;
        s->top=p->next;//讓棧頂指向下一個節點
        free(p);
        s->count--;
    }else{
        return ;
    }
}
void getEle(StackLink s,LSEletype *e){
    StackLinkP p=s.top;
    *e=p->data;
}
int main()
{
    StackLink s=init();
    LSEletype g;
    LSEletype e=666,f=888;
    printf("鏈棧是否為空:\n%d\n",stackEmpty(s));
    push(&s,e);
    push(&s,f);
    printf("鏈棧是否為空:\n%d\n",stackEmpty(s));
    getEle(s,&g);
    printf("當前棧頂資料為:\n%d\n",g);
    pop(&s,&g);
    getEle(s,&g);
    printf("刪除一個數據後,當前棧頂資料為:\n%d\n",g);
    pop(&s,&g);
    printf("鏈棧是否為空:\n%d\n",stackEmpty(s));
    return 0;
}


相關推薦

資料結構學習筆記-線性表順序儲存C語言實現

寫了一天,終於將線性表的順序儲存實現了,順便惡補了一下指標內容。順序儲存,適合做查詢,鏈式儲存適合做增刪。新增方法主要就是將線性表從後往前遍歷,依次往後挪一位,直到空出想要插入的位置,刪除方法就是將線性表從要刪除的地方往後遍歷,依次往前挪一位。#include <std

資料結構學習筆記-儲存C語言實現

棧是一個特殊的線性表,後進先出,既然是線性表,就會分為順序儲存和鏈式儲存,下面就是棧的鏈式儲存部分,也稱作鏈棧。單鏈表是有頭指標頭節點的,通常鏈棧的棧頂就相當於頭指標,因為初始化的鏈棧是空的,即top=

資料結構學習筆記-佇列的儲存C語言實現

佇列是一種先進先出的線性表。是線性表就會有鏈式儲存,因為先進先出,鏈佇列就是在鏈尾進鏈頭出,這樣一來,定義鏈佇列時就需要定義兩個指標,分別指向佇列的隊頭(相當於頭指標)、隊尾。如果隊頭等於隊尾,則該鏈佇

資料結構—— 一元多項式的表示及相加C語言實現

程式碼比較簡單,沒有完全按照嚴蔚敏版《資料結構(C語言版)》上39頁到43頁上的要求,只是實現了簡單功能,且此程式碼輸入多項式時只能按升冪的順序輸入(因為沒有寫多項式排序的函式) 個人感覺此程式碼短小精悍,且易理解,看懂了的話可以嘗試完全按照書上的要求自己寫程式

資料結構與演算法——線性錶鏈儲存單迴圈連結串列

今天總結迴圈單鏈表 什麼是單迴圈連結串列? 單鏈表終端結點的指標域是指向空的,如果將其指向頭結點,這樣就形成了一個環,那麼這種首尾相接的環就夠成了單迴圈連結串列. 單鏈表中我們都是用頭指標來表示的,但是在單迴圈連結串列裡,用尾指標(指向最後一個節點)。為什麼要這樣,因為如果

算法 - 與隊列C 語言實現

元素 語言 訪問規則 並且 下標 出棧 數據結構 規則 算法 目標: 理解 棧 與 隊列 這兩種數據結構, 並且知道如何應用。 算法 + 數據結構 = 程序 一、堆棧 堆棧是一組元素的集合,類似於數組,但數組可以按下標訪問,堆棧的訪問規則只能為push 與

資料結構學習筆記——堆疊之儲存結構c語言實現

棧的鏈式儲存結構使用單鏈表實現,同線性表一樣,鏈式儲存結構的堆疊在儲存空間的利用上顯得更加靈活,只要硬體允許一般不會出現溢位的情況。但鏈式棧相對於順序棧稍顯麻煩,若所需堆疊空間確定,順序棧顯得方便一些。關於鏈式和順序式的選擇視具體情況而定。 1.棧的鏈式儲存結構

資料結構線性表之儲存結構單鏈表(C++)

一. 標頭檔案—linkedlist.h 1 #ifndef _LIKEDLIST_H_ 2 #define _LIKEDLIST_H_ 3 4 #include <iostream> 5 6 template <class T> 7 struc

資料結構---閒心表:儲存結構

前面說到線性表的順序儲存結構,它的插入和刪除動作需要移動大量元素,費時。 原因:順序儲存結構的線性表,相鄰元素的儲存結構也是鄰居關係,中間沒有空隙,無法快速介入,而刪除的時候回留出空隙,需要彌補。 線性錶鏈式儲存結構定義 資料域(data):儲存資料元素資訊的域 指標

儲存結構c語言實現

#include <stdio.h> #include <stdlib.h> #define T 1 #define F 0 typedef int Status; type

資料結構之單鏈佇列(儲存佇列)的實現(C語言)

學習參考: 嚴蔚敏: 《資料結構-C語言版》 基本操作 入隊 出隊 建空佇列 判隊空 獲取隊首元素 獲取佇列長度 清空佇列 程式碼實現 佇列結點定義 typedef stru

資料結構中佇列的儲存結構的基本操作

#include <stdio.h> #include <stdlib.h> /* 定義:front指標指向頭結點,當front==rear時,表示空佇列 */ typedef int QElemtype; typedef struct QNo

資料結構|二叉樹的儲存實驗6.2

一、實驗目的 1、   熟練理解樹和二叉樹的相關概念,掌握的儲存結構和相關操作實現; 2、   掌握樹的順序結構的實現; 3、   學會運用樹的知識解決實際問題 二、 實驗內容 1、自己確定一個二叉樹(樹結點型別、數目和結構自定)利用鏈式儲存結構方法儲存。實現樹

嚴蔚敏 資料結構 二叉樹儲存結構 遍歷等操作

課本 《資料結構(C語言版)(第2版)》 嚴蔚敏版 樹結構的學習。 編譯環境:DEV C++ 檔案格式為 cpp(c++檔案型別),前者的引用函式,在 C 的情況下沒完成。 實現: 二叉樹的先序遍歷

資料結構學習筆記——線性表之順序表c語言實現

1.概念 順序表即線性表的順序儲存結構 ,指的是用一段地址連續的儲存單元依次儲存線性表資料元素。線上性表中,每個資料元素的型別都相同,一般可以用一維陣列來實現順序儲存結構。 2.實現 (1)建立順序表的結構 利用c語言結構體來建立順序表的結構,順序表結構體中

資料結構學習筆記-迴圈連結串列C語言實現

  迴圈連結串列的概念主要就是讓單鏈表的尾節點的指標不為空並且指向頭節點。像這樣的迴圈連結串列和普通單鏈表除了判斷條件幾乎沒有任何區別,判斷條件就是從p->next是否為空改為p->next是否等於頭節點,如果等於頭節點則迴圈結束。#include <std

資料結構學習筆記-串C語言實現

串由零個或多個字元組成,說白了就是字串。串的儲存方式相對於線性表來講有些不同,他分為以下幾種:順序儲存、堆分配儲存、鏈式儲存。順序儲存通常在陣列中的頭元素存放字串長度。堆分配儲存通常會動態分配空間。鏈式儲存分為兩種,一種是每個節點存放一個字元(比較浪費空間),另一種則是每個節

數據結構-線性表的存儲相關算法C語言實現

存儲位置 lib 方法 lis 逆序 順序 程序 查詢 c語言 鏈表的簡單介紹 為什麽需要線性鏈表 當然是為了克服順序表的缺點,在順序表中,做插入和刪除操作時,需要大量的移動元素,導致效率下降。 線性鏈表的分類 按照鏈接方式: 按照實現角度: 線性鏈表的創建和簡單遍歷

資料結構——入,出,佇列相關操作C語言實現

閱讀過程之中可能會花費比較多的時間:建議直接翻到最後,有完整的程式碼可以使用 程式準備工作 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include<proc

資料結構中用實現表示式求值c語言實現

/* 該程式完成了個位數的各類表示式求值 運用了資料結構中的棧及對棧操作的各類函式,操作全用指標完成 如輸入 2+3*(3+3*1)#  輸出結果為 20 經測試個位數的表示式運算結果均正確 */ #include<stdio.h> #include<std