1. 程式人生 > >資料結構(c語言)——鏈棧儲存結構及實現

資料結構(c語言)——鏈棧儲存結構及實現

鏈棧:就是一種特殊的單鏈表,FILO(先進後出)

通常對於連結串列來說:

1.是不需要頭節點的。

2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。

 

不多bibi你們都懂哈,直接上程式碼: 

鏈棧結構:

typedef struct StockNode{
    // 資料域
    Element data;

    // 下個節點的指標域
    struct StockNode *next;
}StockNode,*LinkStackPtr;

typedef struct LinkStack{
    // 棧的大小
    int count;

    // 記錄棧頂元素
    LinkStackPtr top;
}LinkStack;

 鏈棧的操作:

// 當前棧是否為空棧
bool StatckEmpty(LinkStack *ls){
    if(ls->count > 0){
        return false;
    }
    return true;
}

// 入棧操作
Status Push(LinkStack *ls,Element v){
    LinkStackPtr e = (LinkStackPtr)malloc(sizeof(StockNode));
    e->data = v;

    // 把當前的棧頂元素值賦值給新節點的直接後繼
    e->next = ls->top;
    // 將新節點賦值給棧頂指標
    ls->top = e;

    ls->count++;

    return OK;
}


// 彈棧
Status Pop(LinkStack *ls,Element *v){
    if(StatckEmpty(ls)){
        return ERROR;
    }

    *v = ls->top->data;

    // 用來記錄要出棧的元素節點
    LinkStackPtr temp;
    temp = ls->top;

    // 使棧頂指標下移一位,指向後面的節點
    ls->top = ls->top->next;

    // 釋放要出棧元素所在空間
    free(temp);

    // 將棧的大小更新
    ls->count--;

    return OK;
}

// 獲取棧頂元素
void GetTop(LinkStack *ls,Element *v){
    if(!StatckEmpty(ls)){
        *v = ls->top->data;
    }
}

// 獲取棧的元素個數
int StatckLength(LinkStack *ls){
    if(!StatckEmpty(ls)){
        return ls->count;
    }
    return -1;
}

// 初始化棧
LinkStack* InitStack(){
    LinkStack *ls;
    ls = (LinkStack *)malloc(sizeof(LinkStack));
    ls->top = NULL;
    ls->count = 0;
}

// 建立一個鏈棧
void CreateLinkStack(LinkStack *ls,int size){
    LinkStackPtr e;

    for(int i=1;i < size;i++){
        Push(ls,i);
    }
}

// 列印棧:
void LinkStackPrint(LinkStack *ls){
	LinkStackPtr p = ls->top;

	printf("[");
	while (p)
	{
		printf("%d", p->data);
		p = p->next;
		if(p){
            printf(", ");
		}
	}
	printf("]\n");
}

// 清空棧
Status ClearStack(LinkStack *ls){
    // 用來記錄要出棧的元素節點
    LinkStackPtr temp;

    while(!stackEmpty(ls)){

        temp = ls->top;

        // 使棧頂指標下移一位,指向後面的節點
        ls->top = ls->top->next;

        // 釋放要出棧元素所在空間
        free(temp);

        // 將棧的大小更新
        ls->count--;
    }
    return OK;
}

// 銷燬棧
Status DestoryStack(LinkStack *ls){
    ClearStack(ls);
    free(ls);

    return OK;
}

測試程式碼:

void LinkStackTest(){
    LinkStack *ls = InitStack();
    printf("棧被初始化了\n");

    CreateLinkStack(ls,5);
    printf("%d個元素已入棧",5-1);
    LinkStackPrint(ls);

    printf("一個元素入棧:");
    Push(ls,5);
    LinkStackPrint(ls);

    Element pv;
    Element *resP;
    resP = &pv;
    Pop(ls,resP);
    printf("當前出棧元素:%d\n",*resP);

    int length = StatckLength(ls);
    printf("當前鏈棧的長度:%d\n",length);

    GetTop(ls,resP);
    printf("當前棧頂元素:%d\n",*resP);

    ClearStack(ls);
    //DestoryStack(ls);銷燬後這個棧將不存在,而不是個空棧

    printf("清空整個棧後:");
    LinkStackPrint(ls);
}

 

執行結果