日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

如何輕松使用 C 語言實(shí)現(xiàn)一個(gè)棧?

作者 | 寫代碼的籃球球癡
 

1.什么是數(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ù),如果你是一個(gè)籃球愛好者,那么你的球鞋就是你的數(shù)據(jù),結(jié)構(gòu)就是怎么把這些數(shù)據(jù)排列組合,怎么把數(shù)據(jù)擺放好才能方便你找到這些數(shù)據(jù),把數(shù)據(jù)和結(jié)構(gòu)合在一起理解就是所謂的數(shù)據(jù)結(jié)構(gòu),簡單點(diǎn),就是處理數(shù)據(jù)的方式方法。

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

如何輕松使用 C 語言實(shí)現(xiàn)一個(gè)棧?

2.什么是棧?

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

如何輕松使用 C 語言實(shí)現(xiàn)一個(gè)棧?如何輕松使用 C 語言實(shí)現(xiàn)一個(gè)棧?如何輕松使用 C 語言實(shí)現(xiàn)一個(gè)棧?

用%20C%20語言實(shí)現(xiàn)一個(gè)棧

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

#include%20"stdio.h"
#include%20"stdlib.h"

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

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


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

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

int%20IsStackEmpty(struct%20Stack%20*stack)
{
/*如果頭指針指向下一個(gè)為空,說明棧為空*/
if(stack->head->next%20==%20)
return%201;
else
return%200;
}

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

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

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


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

1-棧頭部

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

struct%20Stack%20*stack%20=%20;
stack%20=%20StackInit;

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

2-出棧

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

int StackPop(struct Stack *stack,int *data)
{
struct List *tmp = ;
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;
}

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

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

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

如何輕松使用 C 語言實(shí)現(xiàn)一個(gè)棧?

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;
}

4.用數(shù)組來實(shí)現(xiàn)一個(gè)棧

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

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

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

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


struct Stack * StackInit(void)
{
struct Stack *stack = ;
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 fulln");
return (-1);
}
stack->stack_array[stack->size] = data;
stack->size++;
//printf("push:%d size:%dn",data,stack->size);
return 0;
}

int IsStackEmpty(struct Stack *stack)
{
/*如果頭指針指向下一個(gè)為空,說明棧為空*/
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:%dn",*data,stack->size);
return 0;
}


int main(void)
{
int i = 0;
struct Stack *stack = ;
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;
}

5.總結(jié)

既然有棧,就會(huì)有和棧不一樣的數(shù)據(jù)結(jié)構(gòu),有一種數(shù)據(jù)結(jié)構(gòu)叫做隊(duì)列,棧的數(shù)據(jù)結(jié)構(gòu)特點(diǎn)是先進(jìn)后出,隊(duì)列的數(shù)據(jù)結(jié)構(gòu)特點(diǎn)是先進(jìn)先出,有點(diǎn)意思,棧和隊(duì)列做驅(qū)動(dòng)的同學(xué)很少需要自己寫代碼實(shí)現(xiàn),正常情況下都是SDK集成了方法,直接調(diào)用接口就好了,但是寫應(yīng)用的同學(xué),經(jīng)常要自己實(shí)現(xiàn)一個(gè)棧或者隊(duì)列,特別是大企業(yè)面試,這些算是非?;A(chǔ)的題目,最好是閉著眼睛就能寫出來的那種。

【End】

分享到:
標(biāo)簽:語言
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定