C语言怎么实现栈
这篇文章主要介绍“C语言怎么实现栈”,在日常操作中,相信很多人在C语言怎么实现栈问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么实现栈”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的文山州网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
什么是数据结构?
数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数据排列组合,怎么把数据摆放好才能方便你找到这些数据,把数据和结构合在一起理解就是所谓的数据结构,简单点,就是处理数据的方式方法。
平时在家里面,你有没有随便摆放自己的鞋子,然后要找鞋子的时候要花费非常多是时间,可能你老婆也很生气,每天都乱摆鞋子导致她打扫卫生非常麻烦,然后有一天,你买了一个非常酷的鞋架,有了这个鞋架之后,你的鞋子终于有家了,这个鞋架就是起到处理鞋子的作用了。
什么是栈?
栈可以理解为数据结构中的一种,这种数据结构的特点是先进去的人「数据」后出来,就像下面的图片一样,如果栈是一个洞,人「数据」只能从洞的一个口进去,然后出来也只能从一个口出来,而且洞的宽度就只能容纳一个人「数据」,好了,那先进去的那个人「数据」最傻逼了,一定要等后面进来的人「数据」都先出去了才能出去。
用C 语言实现一个栈
我写代码是很水的,之前有一个同学写了一个栈让我检查,我看了下,好像我写代码的能力比他厉害一些,代码比较简单,然后讲一下几个比较重要的函数,希望大家在面试的时候,随手就甩出一个栈砸死面试官,哈哈。
#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-栈头部
栈头部,也就是栈顶指针,我们用指针单链表实现一个栈,一定要知道这个栈顶的指针,有头就有栈,没有头,这个栈也就跨了。
struct Stack *stack = NULL;
stack = StackInit();
这个就是定义一个栈,也就是malloc出来一个内存,专门存这个栈顶的。
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 这个位置的数据取出来,取出来后,再把head->next的指针指向 取出来这个位置 的next 位置。
然后再记得free掉。就Ok了。
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;
}
用数组来实现一个栈
数组本身是一种数据结构,使用数组实现一个栈也是非常简单方便的,大家请看。
#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 = 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;
}
到此,关于“C语言怎么实现栈”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
名称栏目:C语言怎么实现栈
地址分享:http://azwzsj.com/article/geseeo.html