堆栈有几种实现方式图解,堆栈有几种实现方式图

  堆栈有几种实现方式图解,堆栈有几种实现方式图

  如何解决写爬虫IP受阻的问题?立即使用。

  堆栈有3种实现方式,实现方式为:

  一、静态数组堆栈

  在静态数组堆栈中,STACK_SIZE表示堆栈中可以存储的元素的最大值,top_element用作数组下标来表示堆栈中的元素。当top_element==-1时,堆栈为空。当top_element==STACK_SIZE-1时,堆栈已满。push时,top_element加1,top_element==0时,表示第一个栈元素;在pop时,top_element减少1。

  A_stack.c源代码如下:

  [cpp]查看普通文本

  /*

  **

  * *静态数组实现堆栈程序a_stack.c,数组长度由#define决定。

  */

  #includestack.h

  #includeassert.h

  # includestdio.h

  #define STACK_SIZE 100 /*堆栈中元素的最大数量*/

  /*

  * *在堆栈中存储一个数组和指向堆栈顶部元素的指针

  */

  静态STACK_TYPE堆栈[STACK _ SIZE];

  static int top _ element=-1;

  /*推送*/

  void push(STACK_TYPE值)

  {

  断言(!is _ full());/*在将堆栈推入堆栈之前,确定堆栈是否已满*/

  top _ element=1;

  stack[top_element]=值;

  }

  /*流行*/

  无效弹出(无效)

  {

  断言(!is _ empty());/*在弹出堆栈之前确定它是否为空*/

  top _ element-=1;

  }

  /*顶部*/

  堆栈类型顶部(空)

  {

  断言(!is _ empty());

  返回堆栈[top _ element];

  }

  /* is_empty */

  int是_empty(void)

  {

  返回top _ element==-1;

  }

  /*是_满*/

  int is_full(void)

  {

  return top _ element==STACK _ SIZE-1;

  }

  /*

  * *定义一个打印函数来打印堆栈中的元素。

  */

  作废打印(作废)

  {

  int I;

  i=top _ element

  Printf(打印出静态数组堆栈中的值:);

  如果(i==-1)

  Printf(这是一个空堆栈\ n );

  而(我!=-1)

  printf(%d ,stack[I-]);

  printf( \ n );

  }

  int main(void)

  {

  print();

  推(10);推(9);推(7);推(6);推(5);

  推(4);推(3);推(2);推(1);推送(0);

  Printf(推入值后:\ n );

  print();

  printf( \ n );

  pop();

  pop();

  printf( pop弹出几个元素后堆栈元素:\ n );

  print();

  printf( \ n );

  printf( top():% d \ n ,top())调用的top值;

  返回1;

  }结果如下:

  二、动态数组堆栈

  头文件还是用stack.h,变化不大。添加stack_size变量而不是STACK_SIZE来节省堆栈的长度。数组用指针代替,全局变量下默认值为0。

  create_stack函数首先检查堆栈是否已经创建,然后分配所需的内存量,并检查分配是否成功。destroy_stack函数首先检查堆栈是否存在,并在内存被释放后将长度和指针变量重置为零。向is_empty和is_full函数添加一个断言,以防止在创建堆栈之前调用任何堆栈函数。

  D_stack.c源代码如下:

  [cpp]查看普通文本

  /*

  * *通过动态分配数组实现的堆栈程序d_stack.c

  * *堆栈的长度是在调用创建堆栈的函数时给出的。这个函数必须在调用任何其他操作堆栈的函数之前使用。

  */

  #includestack.h

  # includestdio.h

  # includemalloc.h

  #includeassert.h

  /*

  * *用于存储堆栈元素和指向堆栈顶部元素的指针的数组

  */

  静态STACK _ TYPE * stack

  静态int stack _ size

  static int top _ element=-1;

  /*创建堆栈*/

  void create_stack(size_t size)

  {

  assert(stack _ size==0);

  stack _ size=size

  STACK=(STACK _ TYPE *)malloc(STACK _ size * sizeof(STACK _ TYPE));

  if(stack==NULL)

  perror(“malloc分配失败”);

  }

  /*销毁*/

  void销毁_堆栈(void)

  {

  assert(stack _ size 0);

  stack _ size=0;

  免费(栈);

  stack=NULL

  }

  /*推送*/

  void push(STACK_TYPE值)

  {

  断言(!is _ full());

  top _ element=1;

  stack[top_element]=值;

  }

  /*流行*/

  无效弹出(无效)

  {

  断言(!is _ empty());

  top _ element-=1;

  }

  /*顶部*/

  堆栈类型顶部(空)

  {

  断言(!is _ empty());

  返回堆栈[top _ element];

  }

  /* is_empty */

  (同Internationalorganizations)国际组织是_empty(无效)

  {

  assert(stack _ size 0);

  返回top _ element==-1;

  }

  /*是_满*/

  int is_full(void)

  {

  assert(stack _ size 0);

  return top _ element==stack _ size-1;

  }

  /*

  ** 定义一个打印函数,用来打印堆栈里面的元素。

  */

  作废打印(作废)

  {

  int I;

  i=顶部元素

  printf(打印出动态数组堆栈里面的值: );

  如果(i==-1)

  printf(这是个空堆栈\ n’);

  而(我!=-1)

  printf(%d ,stack[I-]);

  printf( \ n );

  }

  int main(void)

  {

  创建_堆栈(50);

  print();

  推(10);推(9);推(7);推(6);推(5);

  推(4);推(3);推(2);推(1);推送(0);

  printf(推送压入数值后:\ n’);

  print();

  printf( \ n );

  pop();

  pop();

  printf(经过流行音乐弹出几个元素后的堆栈元素:\ n’);

  print();

  printf( \ n );

  printf(top()调用出来的值:%d\n ,top());

  destroy _ stack();

  返回1;

  }结果如下图:

  三、链式堆栈

  由于只有堆栈顶部元素才可以被访问,因此适用单链表可以很好实现链式堆栈,而且无长度限制。把一个元素压入堆栈是通过在链表头部添加一个元素实现。弹出一个元素是通过删除链表头部第一个元素实现。由于没有长度限制,故不需要创建_堆栈函数,需要销毁_堆栈进行释放内存以避免内存泄漏。

  头文件stack.h不变,l_stack.c源代码如下:

  [cpp]查看普通文本

  /*

  ** 单链表实现堆栈,没有长度限制

  */

  #includestack.h

  # includestdio.h

  # includemalloc.h

  #includeassert.h

  #定义假0

  /*

  ** 定义一个结构以存储堆栈元素。

  */

  数据类型说明结构堆栈节点

  {

  堆栈类型值;

  struct STACK _ NODE * next

  }堆栈节点

  /* 指向堆栈中第一个节点的指针*/

  静态堆栈节点*堆栈

  /*创建堆栈*/

  void create_stack(size_t size)

  {}

  /*销毁堆栈*/

  空的销毁_堆栈(无效)

  {

  而(!is_empty())

  pop();/* 逐个弹出元素,逐个释放节点内存*/

  }

  /*推送*/

  空推(STACK_TYPE值)

  {

  堆栈节点*新节点

  new _ node=(栈节点*)malloc(sizeof(栈节点));

  如果(新节点==空)

  perror( malloc fail );

  新节点值=值;

  new _ node-next=stack;/* 新元素插入链表头部*/

  堆栈=新节点;/*堆栈重新指向链表头部*/

  }

  /*流行*/

  无效弹出(无效)

  {

  堆栈节点*第一个节点

  断言(!is _ empty());

  first _ node=堆栈

  stack=first _ node-next;

  free(first _ node);

  }

  /*顶部*/

  堆栈类型顶部(空)

  {

  断言(!is _ empty());

  返回堆栈值;

  }

  /* is_empty */

  (同Internationalorganizations)国际组织是_empty(无效)

  {

  返回堆栈==空

  }

  /*是_满*/

  int is_full(void)

  {

  返回错误的

  }

  /*

  ** 定义一个打印函数,用来打印堆栈里面的元素。

  */

  作废打印(作废)

  {

  堆栈节点* p _ node

  p _ node=堆栈

  printf(打印出链式堆栈里面的值: );

  if(p_node==NULL)

  printf(堆栈为空\ n’);

  而(p_node!=空)

  {

  printf(%d ,p _ node-value);

  p _ node=p _ node-next;

  }

  printf( \ n );

  }

  int main(void)

  {

  print();

  推(10);推(9);推(7);推(6);推(5);

  推(4);推(3);推(2);推(1);推送(0);

  printf(推送压入数值后:\ n’);

  print();

  printf( \ n );

  pop();

  pop();

  printf(经过流行音乐弹出几个元素后的堆栈元素:\ n’);

  print();

  printf( \ n );

  printf(top()调用出来的值:%d\n ,top());

  destroy _ stack();

  返回1;

  }结果如下图:

  推荐教程:《java视频教程》以上是栈。有多少种方式可以实现?更多详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: