C語(yǔ)言實(shí)現(xiàn)鏈棧的步驟
鏈棧圖解

鏈棧的常規(guī)操作
/********************* 鏈棧的常規(guī)操作 ****************************/ LinkStack InitLinkStack(); // 初始化鏈棧 int StackEmpty(); // 判斷鏈??? int StackLength(); // 求鏈棧長(zhǎng)(鏈棧元素個(gè)數(shù)) int Push(); // 入棧 壓棧 ElemType Pop(); // 出棧 彈棧 void DestroyStack(); // 銷(xiāo)毀鏈棧 /***************************************************************/
定義鏈棧結(jié)構(gòu)體
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
typedef int ElemType; // 鏈棧存儲(chǔ)元素的數(shù)據(jù)類(lèi)型
/*
* 定義鏈棧結(jié)構(gòu)體
*/
typedef struct Node{
ElemType data; // 棧結(jié)點(diǎn)數(shù)據(jù)域
struct Node *next; // 棧結(jié)點(diǎn)指針域
}*LinkStack, Node;
初始化鏈棧
// 初始化鏈棧(帶頭結(jié)點(diǎn)的鏈棧)
LinkStack InitLinkStack(){
LinkStack s = (LinkStack)malloc(sizeof(struct Node));
s -> next = NULL;
return s;
}
鏈棧判空
/*
* 判斷鏈棧是否空
* s 鏈棧
*/
int StackEmpty(LinkStack s){
if(s == NULL){
return FALSE;
}
return s -> next == NULL;
}
因?yàn)槭擎準(zhǔn)酱鎯?chǔ)結(jié)構(gòu),無(wú)需鏈棧判滿(mǎn)。
計(jì)算鏈棧的長(zhǎng)度
/*
* 求鏈棧長(zhǎng)度(棧中元素個(gè)數(shù))
* s 鏈棧
*/
int StackLength(LinkStack s){
LinkStack p;
int len = 0;
if(StackEmpty(s)){
return FALSE;
}
p = s -> next; // 帶頭結(jié)點(diǎn)的鏈棧要先移動(dòng)一下
while(p != NULL){
len ++;
p = p -> next;
}
return len;
}
鏈棧入棧(Push)
/*
* 入棧 壓棧
* s 鏈棧
* data 入棧數(shù)據(jù)
*/
int Push(LinkStack s, ElemType data){
// 分配入棧結(jié)點(diǎn)
Node *new_node = (Node *)malloc(sizeof(struct Node));
if (new_node == NULL) return FALSE; // 結(jié)點(diǎn)分配失敗
// 跟單鏈表一樣使用頭插法
new_node -> data = data;
new_node -> next = s -> next;
s -> next = new_node;
return TRUE;
}
鏈棧出棧(Pop)
/*
* 出棧 彈棧
* s 鏈棧
*/
ElemType Pop(LinkStack s){
LinkStack top;
ElemType data;
// 判???
if(StackEmpty(s)){
return FALSE;
}
top = s -> next; // 訪問(wèn)棧頂結(jié)點(diǎn)
data = top -> data; // 取出棧頂元素
s -> next = top -> next;
free(top); // 釋放棧頂空間
return data;
}
鏈棧各操作測(cè)試
// 程序主入口
int main(int argc, char const *argv[])
{
LinkStack s = InitLinkStack();
printf("StackEmpty():%d\n", StackEmpty(s));
printf("StackLength():%d\n\n", StackLength(s));
// 入棧元素
ElemType datas[] = {1, 3, 5, 7, 9};
// 動(dòng)態(tài)計(jì)算入棧元素個(gè)數(shù)
int len = sizeof(datas) / sizeof(datas[0]);
// for循環(huán)依次入棧
printf("Push():");
for(int i = 0; i < len; i++){
printf("%d\t", datas[i]);
Push(s, datas[i]);
}
printf("\nStackEmpty():%d\n", StackEmpty(s));
printf("StackLength():%d\n\n", StackLength(s));
// 出棧 彈棧
printf("Pop(): ");
while(!StackEmpty(s)){
printf("%d\t", Pop(s));
}
printf("\nStackEmpty():%d\n", StackEmpty(s));
printf("StackLength():%d\n\n", StackLength(s));
return 0;
}
結(jié)果如下:
StackEmpty():1 StackLength():0 Push():1 3 5 7 9 StackEmpty():0 StackLength():5 Pop(): 9 7 5 3 1 StackEmpty():1 StackLength():0
源代碼
源代碼已上傳到 GitHub Data-Structure-of-C,歡迎大家來(lái)訪。
以上就是C語(yǔ)言實(shí)現(xiàn)鏈棧的步驟的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言實(shí)現(xiàn)鏈棧的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言動(dòng)態(tài)內(nèi)存的分配實(shí)例詳解
動(dòng)態(tài)內(nèi)存管理同時(shí)還具有一個(gè)優(yōu)點(diǎn),當(dāng)程序在具有更多內(nèi)存的系統(tǒng)上需要處理更多數(shù)據(jù)時(shí),不需要重寫(xiě)程序,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的相關(guān)資料,需要的朋友可以參考下2022-06-06
Qt圖形圖像開(kāi)發(fā)之曲線(xiàn)圖模塊QCustomplot庫(kù)生成靜態(tài)、動(dòng)態(tài)曲線(xiàn)詳細(xì)教程圖解
這篇文章主要介紹了Qt圖形圖像開(kāi)發(fā)之曲線(xiàn)圖模塊QCustomplot庫(kù)畫(huà)靜態(tài)、動(dòng)態(tài)曲線(xiàn)詳細(xì)教程圖解,需要的朋友可以參考下2020-03-03
通過(guò)C++程序示例理解設(shè)計(jì)模式中的外觀模式
這篇文章主要介紹了通過(guò)設(shè)計(jì)模式中的外觀模式及相關(guān)的C++程序示例,外觀模式在高層提供了一個(gè)統(tǒng)一的接口實(shí)現(xiàn)一定程度上的解耦,需要的朋友可以參考下2016-03-03
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列的實(shí)現(xiàn)詳解
隊(duì)列只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線(xiàn)性表,隊(duì)列具有先進(jìn)先出FIFO(First In First Out)的原則。本文將通過(guò)實(shí)例詳細(xì)說(shuō)說(shuō)隊(duì)列的實(shí)現(xiàn),需要的可以學(xué)習(xí)一下2022-10-10

