zoukankan      html  css  js  c++  java
  • 数据结构-栈的顺序结构两种方式

    第一种结构:

      存储空间有限,适用于知道存储长度的情况下。操作实现很简单。

     1 #include "stdio.h"
     2 
     3 
     4 #define MAXSIZE 50
     5 #define STACKINCREMENT 10
     6 #define OK 1
     7 #define ERROR 0
     8 typedef int SElemType;
     9 typedef int Status;
    10 
    11 typedef struct
    12 {
    13     SElemType data[MAXSIZE];    //存储数组
    14     int top;                    //栈顶
    15 }Stack;
    16 
    17 //初始化栈
    18 Status InitStack(Stack &S)
    19 {
    20     S.top = -1;        //栈顶指向-1代表空栈
    21     return OK;
    22 }
    23 
    24 //重置栈为空栈
    25 Status ClearStack(Stack &S)
    26 {
    27     S.top = -1;    //与初始化一样道理
    28     return OK;
    29 }
    30 
    31 //判断栈是否为空,空栈返回OK 否则返回ERROR
    32 Status StackEmpty(Stack S)
    33 {
    34     if(S.top < 0)
    35         return OK;
    36     else
    37         return ERROR;
    38 }
    39 
    40 //返回栈的长度
    41 int StackLength(Stack S)
    42 {
    43     return S.top+1;    //因为top值是做数组下标所以比长度小一
    44 }
    45 
    46 //若栈不为空 用e返回栈顶数据 并返回OK 否则返回ERROR
    47 Status GetTop(Stack S, SElemType &e)
    48 {
    49     if(StackEmpty(S))
    50         return ERROR;
    51     e = S.data[S.top];
    52     return OK;
    53 }
    54 
    55 //若栈不为空 把e插入栈顶 并返回OK 否则返回ERROR
    56 Status Push(Stack &S, SElemType e)
    57 {
    58     if(S.top >= MAXSIZE-1)
    59         return ERROR;
    60     S.top++;
    61     S.data[S.top] = e;
    62     return OK;
    63 }
    64 
    65 //若栈不为空 删除栈顶数据 并用e返回值 并返回OK 否则返回ERROR
    66 Status Pop(Stack &S, SElemType &e)
    67 {
    68     if(StackEmpty(S))
    69         return ERROR;
    70     if(StackEmpty(S))
    71         return ERROR;
    72     e = S.data[S.top];
    73     S.top--;
    74     return OK;
    75 }
    76 
    77 //遍历Visit()函数
    78 Status StackTraverse(Stack S, void (* Visit)(SElemType e))
    79 {
    80     for (int i = 0; i <= S.top; i++)
    81         Visit(S.data[i]);
    82     printf("
    ");
    83     return OK;
    84 }
    85 
    86 //StackTraverse调用函数
    87 //在这里为输出数据
    88 void Visit(SElemType e)
    89 {
    90     printf("%d ", e);
    91 }

      因为数据是存储在数组之中,所以没有销毁栈的基本操作函数

    第二种结构:

      相比第一种结构这种方法可以在上限的存储时增加存储容量的大小,使用更加灵活。操作实现依旧简单。

      1 #include "stdio.h"
      2 #include "stdlib.h"
      3 
      4 typedef int Status;        //存储空间初始分配
      5 typedef int SElemType;    //存储空间分配增量
      6 #define ERROR 0
      7 #define OK 1
      8 #define STACK_INIT_SIZE 100
      9 #define STACKINCREMENT 10
     10 
     11 typedef struct
     12 {
     13     SElemType * base;    //在栈构造之前和销毁之后base的值为NULL
     14     SElemType * top;    //栈顶指针
     15     int StackSize;        //当前已分配的存储空间,以元素为单位
     16 }Stack;
     17 
     18 //构造一个空栈
     19 Status InitStack (Stack &S)
     20 {
     21     S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));    //分配基本空间
     22     if(!S.base)            //判断是否分配成功
     23         return ERROR;
     24     S.top = S.base;        //指向栈顶
     25     S.StackSize = STACKINCREMENT;    //初始链表最大长度
     26     return OK;
     27 }//InitStack
     28 
     29 //销毁一个栈
     30 Status DestroyStack(Stack &S)
     31 {
     32     free(S.base);            //收回空间
     33     S.top = S.base = NULL;    //栈顶和base均指向空
     34     return OK;
     35 }
     36 
     37 //重置表为空表
     38 Status ClearStack(Stack S)
     39 {
     40     S.top = S.base;//栈顶指向首位代表表空
     41     return OK;
     42 }
     43 
     44 //若S为空栈返回OK 否则返回ERROR
     45 Status StackEmpty(Stack S)
     46 {
     47     if (S.top == S.base)
     48         return OK;
     49     else
     50         return ERROR;
     51 }
     52 
     53 //返回栈的长度
     54 int StackLength(Stack S)
     55 {
     56     SElemType * p = S.base;
     57     int i = 0;                //计数值为表长
     58     while(p != S.top)
     59     {
     60         p++;
     61         i++;
     62     }
     63     return i;
     64 }
     65 
     66 //若栈不空则用e返回栈顶数据并返回OK否则返回ERROR
     67 Status GetTop(Stack S, SElemType &e)
     68 {
     69     if (StackLength(S) == 0)    //空栈
     70         return ERROR;
     71     e = *S.top;    
     72     return OK;
     73 }
     74 
     75 //插入新的栈顶数据
     76 Status Push(Stack &S, SElemType e)
     77 {
     78     if(S.top - S.base >=S.StackSize)    //空间不足
     79     {
     80         S.base = (SElemType *)realloc(S.base, (S.StackSize + STACKINCREMENT) * sizeof(SElemType));
     81         if(!S.base)
     82             return ERROR;
     83         S.top = S.base + S.StackSize;
     84         S.StackSize += STACKINCREMENT;
     85     }
     86     S.top++;
     87     *S.top = e;
     88     return OK;
     89 }
     90 
     91 //若栈不空 则删除栈顶数据并用e返回且返回OK 否则返回ERROR
     92 Status Pop(Stack &S, SElemType &e)
     93 {
     94     if(StackLength(S) == 0)    //空栈
     95         return ERROR;
     96     e = *S.top;
     97     S.top--;
     98     return OK;
     99 }
    100 
    101 //对栈遍历Visit()函数
    102 Status StackTraverse(Stack S, void (*Visit)(SElemType e))
    103 {
    104     SElemType * p = S.base;
    105     while(p != S.top)
    106         Visit(*++p);
    107     printf("
    ");
    108     return OK;
    109 }
    110 
    111 //StackTraverse调用函数
    112 //在这里做输出栈表用
    113 //顺序为栈底到栈顶
    114 void Visit(SElemType e)
    115 {
    116     printf("%d ",e);
    117 }

    栈是限定仅在表尾进行插入和删除的操作线性表,因此栈的实现比较线性表显得更简单且容易实现。

    参考《数据结构(C语言版)》严蔚敏编著

  • 相关阅读:
    DevOps实施方法论,为什么大企业一定要使用DevOps?
    SpringCloudAlibaba基础入门,基于Nacos构建分布式与配置,Sentinel服务治理
    艾编程Java进阶架构师必看:15次架构演进详解
    实战笔记:来一起探究下Kafka是如何实现万亿级海量数据的高并发写入的?
    520疯狂之后我彻底蒙了,老板让我做技术选型,数据处理选kafka还是RocketMQ?
    如何实现Redis数据持久化以及内存管理之缓存过期机制
    SpringBoot源码深度解析
    分布式缓存Redis高级应用实战:为什么要用缓存机制
    全面上云实战教程:基于阿里云安装配置部署docker详解
    Solr学习笔记(2)—— solr-7.0.0 安装与目录说明
  • 原文地址:https://www.cnblogs.com/ABook/p/5371792.html
Copyright © 2011-2022 走看看