棧的鏈表存儲實現(純程式碼演示)

一點廢話

昨天寫的線性表的鏈表存儲弄得我自己突然來了想法,打算把上學期自己學的數據結構的知識好好複習一下。

也正好打算從WordPress的自建部落格慢慢遷移到部落格園來,好好熟悉一下這個cnblogs的編輯器。(事實證明,好的文章排版是非常重要的)

目前的計劃是「線性表->堆棧->隊列->樹->圖」,這些基本的數據結構弄完之後,就準備開始弄一下基本的排序演算法,啊哈哈哈

 


文件概述

  • stack.h  存放棧(棧結點結構以及結點指針),並對棧的操作函數進行聲明
  • stack.c  對之前在stack.h中聲明的棧的操作函數進行定義

程式碼

  stack.h

typedef int ElementType;
typedef struct SNode *Stack;

struct SNode{
    Stack Next;
    ElementType Data;
};

//Stack has header-Node
Stack CreateStack();                    //生成空堆棧
void Push(Stack S,ElementType item);    //將元素 item 壓入堆棧
int IsEmpty(Stack S);                    //判斷堆棧 S 是否為空
ElementType Pop(Stack S);                //刪除並返回棧頂元素

  stack.c

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

//生成空堆棧
Stack CreatStack(){
    Stack tempStack = (Stack)malloc(sizeof(struct SNode));
    tempStack->Next = NULL;
    return tempStack;
}

//判斷是否為空
int IsEmpty(Stack S){
    return (S->Next == NULL);
}

//將元素 item 壓入堆棧
void Push(Stack S,ElementType item){
    Stack tempStack = (Stack)malloc(sizeof(struct SNode));
    tempStack->Data = item;
    tempStack->Next = S->Next;
    S->Next = tempStack;
}

//刪除並返回棧頂元素
ElementType Pop(Stack S){
    if(IsEmpty(S)){
        printf("Error");
        return;
    }
    Stack tempStack = S->Next;
    ElementType popValue = tempStack->Data;
    S->Next = tempStack->Next;
    free(tempStack);
    return popValue;
}