您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

如何轻松使用 C 语言实现一个栈?

时间:2019-11-04 14:58:02  来源:  作者:
如何轻松使用 C 语言实现一个栈?

作者 | 写代码的篮球球痴
 

1.什么是数据结构?

数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数据排列组合,怎么把数据摆放好才能方便你找到这些数据,把数据和结构合在一起理解就是所谓的数据结构,简单点,就是处理数据的方式方法。

平时在家里面,你有没有随便摆放自己的鞋子,然后要找鞋子的时候要花费非常多是时间,可能你老婆也很生气,每天都乱摆鞋子导致她打扫卫生非常麻烦,然后有一天,你买了一个非常酷的鞋架,有了这个鞋架之后,你的鞋子终于有家了,这个鞋架就是起到处理鞋子的作用了。

如何轻松使用 C 语言实现一个栈?

2.什么是栈?

栈可以理解为数据结构中的一种,这种数据结构的特点是先进去的人「数据」后出来,就像下面的图片一样,如果栈是一个洞,人「数据」只能从洞的一个口进去,然后出来也只能从一个口出来,而且洞的宽度就只能容纳一个人「数据」,好了,那先进去的那个人「数据」最傻逼了,一定要等后面进来的人「数据」都先出去了才能出去。

如何轻松使用 C 语言实现一个栈?如何轻松使用 C 语言实现一个栈?如何轻松使用 C 语言实现一个栈?

用%20C%20语言实现一个栈

我写代码是很水的,之前有一个同学写了一个栈让我检查,我看了下,好像我写代码的能力比他厉害一些,代码比较简单,然后讲一下几个比较重要的函数,希望大家在面试的时候,随手就甩出一个栈“砸死”面试官,哈哈。

#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)
{
/*如果头指针指向下一个为空,说明栈为空*/
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-栈头部

栈头部,也就是栈顶指针,我们用指针单链表实现一个栈,一定要知道这个栈顶的指针,有头就有栈,没有头,这个栈也就跨了。

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

这个就是定义一个栈,也就是malloc出来一个内存,专门存这个栈顶的。

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

先判断这个栈是不是空的,是不是空的判断方法就是通过判断head->next的指针是否为空。

然后把head->next 这个位置的数据取出来,取出来后,再把head->next的指针指向 取出来这个位置 的next 位置。

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

如何轻松使用 C 语言实现一个栈?

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.用数组来实现一个栈

数组本身是一种数据结构,使用数组实现一个栈也是非常简单方便的,大家请看。

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

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

struct Stack{
int stack_array[LENGHT];
unsigned int size;//栈动态长度
};


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)
{
/*如果头指针指向下一个为空,说明栈为空*/
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.总结

既然有栈,就会有和栈不一样的数据结构,有一种数据结构叫做队列,栈的数据结构特点是先进后出,队列的数据结构特点是先进先出,有点意思,栈和队列做驱动的同学很少需要自己写代码实现,正常情况下都是SDK集成了方法,直接调用接口就好了,但是写应用的同学,经常要自己实现一个栈或者队列,特别是大企业面试,这些算是非常基础的题目,最好是闭着眼睛就能写出来的那种。

【End】



Tags:C 语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  Tags: C 语言  点击:(11)  评论:(0)  加入收藏
我们将所有的 C 语言要素放置到一份易读的备忘录上。&bull; 来源:linux.cn &bull; 作者:Seth Kenlon &bull; 译者:郑 &bull;(本文字数:5500,阅读时长大约:8 分钟)我们将所有的 C 语...【详细内容】
2020-10-18  Tags: C 语言  点击:(97)  评论:(0)  加入收藏
C程序是一组函数和数据类型,就像一把锋利的随身匕首,非常灵活,在高手的手上可以幻化出各种招式,杀人于无形。C++程序是一组函数和类,像一门大炮,扛在肩上很重,炮弹打出去威力很大,但...【详细内容】
2019-12-20  Tags: C 语言  点击:(124)  评论:(0)  加入收藏
数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数据排列组合,怎么把数据摆放好才能方便你找到...【详细内容】
2019-11-04  Tags: C 语言  点击:(78)  评论:(0)  加入收藏
TBOX 是一个用 C 语言实现的跨平台开发库。针对各个平台,封装了统一的接口,简化了各类开发过程中常用操作,使你在开发过程中,更加关注实际应用的开发,而不是把时间浪费在琐碎的接...【详细内容】
2019-10-12  Tags: C 语言  点击:(84)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(2)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(11)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(18)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(47)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(49)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(38)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条