24 鏈式棧的基本運算

2021-08-20 17:12:12 字數 3122 閱讀 8337

linkstack.h檔案

#ifndef linkstack_h

#define linkstack_h

#include

#include

#include

//定義鏈式棧節點結構

typedef

struct linknode

linknode;

typedef

struct linkstack

linkstack;

//初始化棧

linkstack* init_linkstack();

//銷毀棧

void free_linkstack(linkstack* stack);

/*判斷棧是否為空stackempty(s)

返回值:

返回0,說明棧為空

返回-1,出錯

返回1,說明棧不為空

*/int isempty_linkstack(linkstack *stack);

//入棧

void push_linkstack(linkstack* stack, void* data);

//出棧

void pop_linkstack(linkstack* stack);

//返回棧頂節點

linknode* top_linkstack(linkstack* stack);

#endif

linkstack.c檔案

#include "linkstack.h"

//初始化棧

linkstack* init_linkstack()

//銷毀棧

void free_linkstack(linkstack* stack)

//如果已經沒有元素了則釋放棧

if(stack->length == 0)

//node記錄棧頂節點

linknode *node = stack->head.next;

//指向下乙個節點

linknode *nextnode = node->next;

//先釋放棧中的節點

while(nextnode != null)

//最後釋放棧

free(stack);

stack = null;

}//判斷棧是否為空stackempty(s)

int isempty_linkstack(linkstack *stack)

//不為空返回1,棧為空返回0

if(stack->length == 0)

return1;}

//入棧

void push_linkstack(linkstack* stack, void* data)

//直接插入新節點,因為對於鏈式棧來說不存在棧滿的情況

//除非計算機本身記憶體不夠用

//複製資料

linknode *node = (linknode *)malloc(sizeof(linknode));

node->data = data;

//節點入棧,同時棧大小+1

node->next = stack->head.next;

stack->head.next = node;

stack->length++;

}//出棧

void pop_linkstack(linkstack* stack)

//棧為空就直接返回

if(stack->head.next == null)

//記錄要出棧的節點

linknode *temp = stack->head.next;

//然後讓head節點指向下乙個節點

stack->head.next = temp->next;

free(temp);

temp = null;

//棧大小-1

stack->length--;

}//返回棧頂節點

linknode* top_linkstack(linkstack* stack)

return

stack->head.next;

}

main.c檔案

#define _crt_secure_no_warnings

#include "linkstack.h"

typedef

struct student

student;

void print_node(linknode *node)

//型別轉換

student *s = (student *)node->data;

printf("number = %d , name = %s\n" , s->number, s->name);

}int main(void)

; student s2 = ;

student s3 = ;

student s4 = ;

student s5 = ;

//資料入棧

printf("-----------push_linkstack-------------\n\n");

push_linkstack(stack , (void *)&s1);

push_linkstack(stack , (void *)&s2);

push_linkstack(stack , (void *)&s3);

push_linkstack(stack , (void *)&s4);

push_linkstack(stack , (void *)&s5);

printf("-----------print_node-------------\n");

while((stack->length) > 0)

free_linkstack(stack);

printf("-----------free_linkstack-------------\n");

return

0;}

測試結果:

23 棧的鏈式儲存結構和基本運算實現

棧的鏈式儲存結構也稱為鏈棧,棧的鏈式儲存結構本質上還是以線性表的鏈式儲存來實現的,一般來說,鍊錶有頭指標,棧也有棧頂指標,那麼可以把棧頂放在鍊錶的頭部,用頭指標來表示棧頂指標,但是這裡我們不用頭結點儲存棧頂節點,而是讓頭結點的next指標指向棧頂節點。圖1 棧的鏈式儲存結構 棧的鏈式儲存結構定義如下...

棧的基本運算

棧和佇列是兩種特殊的線性表,它們的邏輯結構和線性表相同,只是其運算規則較線性表有更多的限制,故又稱它們為運算受限的線性表。棧和佇列被廣泛應用於各種程式設計中。棧的定義及基本運算 1 棧的定義 棧 stack 是限制僅在表的一端進行插入和刪除運算的線性表。1 通常稱插入 刪除的這一端為棧頂 top 另...

順序棧和鏈式棧的基本操作

棧作為一種 資料結構,是一種只能在一端進行插入和刪除操作的特殊 線性表。它按照 先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料 最後乙個資料被第乙個讀出來 棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底 指標。棧是允許在同一端進行插入和刪...