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)站、手機(jī)端網(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)的特點是先進(jìn)去的人「數(shù)據(jù)」后出來,就像下面的圖片一樣,如果棧是一個洞,人「數(shù)據(jù)」只能從洞的一個口進(jìn)去,然后出來也只能從一個口出來,而且洞的寬度就只能容納一個人「數(shù)據(jù)」,好了,那先進(jìn)去的那個人「數(shù)據(jù)」最傻逼了,一定要等后面進(jìn)來的人「數(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)?!钡膶W(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://muchs.cn/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)化