C語言怎么實現(xiàn)棧

這篇文章主要介紹“C語言怎么實現(xiàn)棧”,在日常操作中,相信很多人在C語言怎么實現(xiàn)棧問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言怎么實現(xiàn)棧”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的文山州網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

什么是數(shù)據(jù)結(jié)構(gòu)?

數(shù)據(jù)結(jié)構(gòu)是什么?要了解數(shù)據(jù)結(jié)構(gòu),我們要先明白數(shù)據(jù)和結(jié)構(gòu),數(shù)據(jù)就是一些int char 這樣的變量,這些就是數(shù)據(jù),如果你是一個籃球愛好者,那么你的球鞋就是你的數(shù)據(jù),結(jié)構(gòu)就是怎么把這些數(shù)據(jù)排列組合,怎么把數(shù)據(jù)擺放好才能方便你找到這些數(shù)據(jù),把數(shù)據(jù)和結(jié)構(gòu)合在一起理解就是所謂的數(shù)據(jù)結(jié)構(gòu),簡單點,就是處理數(shù)據(jù)的方式方法。

平時在家里面,你有沒有隨便擺放自己的鞋子,然后要找鞋子的時候要花費非常多是時間,可能你老婆也很生氣,每天都亂擺鞋子導(dǎo)致她打掃衛(wèi)生非常麻煩,然后有一天,你買了一個非常酷的鞋架,有了這個鞋架之后,你的鞋子終于有家了,這個鞋架就是起到處理鞋子的作用了。

什么是棧?

棧可以理解為數(shù)據(jù)結(jié)構(gòu)中的一種,這種數(shù)據(jù)結(jié)構(gòu)的特點是先進去的人「數(shù)據(jù)」后出來,就像下面的圖片一樣,如果棧是一個洞,人「數(shù)據(jù)」只能從洞的一個口進去,然后出來也只能從一個口出來,而且洞的寬度就只能容納一個人「數(shù)據(jù)」,好了,那先進去的那個人「數(shù)據(jù)」最傻逼了,一定要等后面進來的人「數(shù)據(jù)」都先出去了才能出去。

C語言怎么實現(xiàn)棧  
C語言怎么實現(xiàn)棧  
 

用C 語言實現(xiàn)一個棧

我寫代碼是很水的,之前有一個同學(xué)寫了一個棧讓我檢查,我看了下,好像我寫代碼的能力比他厲害一些,代碼比較簡單,然后講一下幾個比較重要的函數(shù),希望大家在面試的時候,隨手就甩出一個棧砸死面試官,哈哈。

#include "stdio.h"
#include "stdlib.h"

struct List{
int data;
struct List * next;
};

struct Stack{
struct List *head;
int size;
};


struct Stack * StackInit(void)
{
struct Stack *stack = NULL;
stack =  (struct Stack*)malloc(sizeof(struct Stack));
stack->head = (struct List *)malloc(sizeof(struct List));
stack->head->next = NULL;
stack->size = 0;
return stack;
}

int StackPush(struct Stack *stack,int data)
{
struct List *tmp = (struct List *)malloc(sizeof(struct List));
tmp->data = data;
tmp->next = stack->head->next;
stack->head->next = tmp;
stack->size++;
//printf("push:%d \n",data);
return 0;
}

int IsStackEmpty(struct Stack *stack)
{
/*如果頭指針指向下一個為空,說明棧為空*/
if(stack->head->next == NULL)
return 1;
else
return 0;
}

int StackPop(struct Stack *stack,int *data)
{
struct List *tmp = NULL;
if(IsStackEmpty(stack))
return -1;

tmp = stack->head->next;
*data = tmp->data;
stack->head->next = tmp->next;
stack->size--;
free(tmp);

//printf("pop:%d \n",*data);
return 0;
}


int main(void)
{
int i = 0;
struct Stack *stack = NULL;
stack = StackInit();
for(i = 0;i<5;i++)
{
StackPush(stack,i);
}
for(i = 0;i<5;i++)
{
int data = 0;
StackPop(stack,&data);
printf("%d ",data);
}
printf("\n");
return 0;
}
   

1-棧頭部

棧頭部,也就是棧頂指針,我們用指針單鏈表實現(xiàn)一個棧,一定要知道這個棧頂?shù)闹羔槪蓄^就有棧,沒有頭,這個棧也就跨了。

struct Stack *stack = NULL;
stack = StackInit();
 

這個就是定義一個棧,也就是malloc出來一個內(nèi)存,專門存這個棧頂?shù)摹?/p>

C語言怎么實現(xiàn)棧    

2-出棧

出棧的方法跟我之前說的差不多,只不過出棧代碼上需要做判斷。

int StackPop(struct Stack *stack,int *data)
{
struct List *tmp = NULL;
if(IsStackEmpty(stack))
return -1;

tmp = stack->head->next;
*data = tmp->data;
stack->head->next = tmp->next;
stack->size--;
free(tmp);

//printf("pop:%d \n",*data);
return 0;
}
 

先判斷這個棧是不是空的,是不是空的判斷方法就是通過判斷head->next的指針是否為空。

然后把head->next 這個位置的數(shù)據(jù)取出來,取出來后,再把head->next的指針指向 取出來這個位置 的next 位置。

然后再記得free掉。就Ok了。

C語言怎么實現(xiàn)棧    

3-入棧

入棧的操作和出棧的操作剛好相反,就是改變一下位置和指針的指向。

int StackPush(struct Stack *stack,int data)
{
struct List *tmp = (struct List *)malloc(sizeof(struct List));
tmp->data = data;
tmp->next = stack->head->next;
stack->head->next = tmp;
stack->size++;
//printf("push:%d \n",data);
return 0;
}
   

用數(shù)組來實現(xiàn)一個棧

數(shù)組本身是一種數(shù)據(jù)結(jié)構(gòu),使用數(shù)組實現(xiàn)一個棧也是非常簡單方便的,大家請看。

#include "stdio.h"
#include "stdlib.h"

/*棧的大小*/
#define LENGHT (100)

struct Stack{
int stack_array[LENGHT];
unsigned int size;//棧動態(tài)長度
};


struct Stack * StackInit(void)
{
struct Stack *stack = NULL;
stack =  (struct Stack*)malloc(sizeof(struct Stack));
stack->size = 0;
return stack;
}

int StackPush(struct Stack *stack,int data)
{
if(stack->size >= LENGHT)
{
printf("stack is full\n");
return (-1);
}
stack->stack_array[stack->size] = data;
stack->size++;
//printf("push:%d size:%d\n",data,stack->size);
return 0;
}

int IsStackEmpty(struct Stack *stack)
{
/*如果頭指針指向下一個為空,說明棧為空*/
if(stack->size == 0)
return 1;
else
return 0;
}

int StackPop(struct Stack *stack,int *data)
{
stack->size--;
if(IsStackEmpty(stack))
return -1;

*data = stack->stack_array[stack->size];

//printf("pop:%d size:%d\n",*data,stack->size);
return 0;
}


int main(void)
{
int i = 0;
struct Stack *stack = NULL;
stack = StackInit();
for(i = 0;i<20;i++)
{
StackPush(stack,i);
}
for(i = 0;i<21;i++)
{
int data = 0;
StackPop(stack,&data);
printf("%d \n",data);
}
printf("\n");
return 0;
}

到此,關(guān)于“C語言怎么實現(xiàn)棧”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

本文標(biāo)題:C語言怎么實現(xiàn)棧
分享路徑:http://m.kartarina.com/article40/geseeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈品牌網(wǎng)站建設(shè)微信小程序ChatGPT企業(yè)建站網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
主站蜘蛛池模板: 久久久久无码精品国产h动漫| 日韩放荡少妇无码视频| 变态SM天堂无码专区| 自慰无码一区二区三区| 亚洲成AV人在线观看天堂无码| 中文无码热在线视频| 国模无码视频一区二区三区| 亚洲国产精品无码成人片久久| 亚洲色无码国产精品网站可下载| 日韩人妻无码精品专区| 色国产色无码色欧美色在线| 国产AV无码专区亚洲AWWW| 亚洲国产精品无码第一区二区三区| 国产强伦姧在线观看无码| 亚洲日韩AV无码一区二区三区人| 国产色无码专区在线观看| 亚洲欧洲国产综合AV无码久久| 亚洲国产精品无码一线岛国| 无码的免费不卡毛片视频| 无码精品A∨在线观看十八禁| 国产成人无码18禁午夜福利p| 18禁成年无码免费网站无遮挡| 综合无码一区二区三区四区五区| 一本无码中文字幕在线观| 一区二区三区无码高清| 亚洲欧洲av综合色无码| 精品无码AV一区二区三区不卡| 久久老子午夜精品无码| 亚洲韩国精品无码一区二区三区| 内射无码午夜多人| 无码人妻精品一区二| 日韩夜夜高潮夜夜爽无码| 人妻精品久久无码区洗澡| 久久精品国产亚洲AV无码偷窥| 日韩精品无码专区免费播放| 99精品国产在热久久无码 | 中文字幕无码一区二区免费| 青春草无码精品视频在线观| 国产裸模视频免费区无码| 国产久热精品无码激情| 亚洲中文字幕久久精品无码A|