• 数据结构(1)----堆栈


    数据结构是什么?数据结构就是数据元素与数据元素存储之间的关系结构。

    堆栈

      一、原则:先进后出,后进先出

          常见问题:假设有入栈顺序 int arr[len],判断 int brr[len]是否是arr[len]的出栈顺序?

      二、

     1 #include "stack.h"
     2 /*
     3 typedef int T;
     4 //#define N 10
     5 //类型
     6 typedef struct Stack{
     7     T* m_vect;   //存储元素内存空间 
     8     size_t size; //堆栈总容量
     9     size_t index;//堆栈中已经存储元素的个数
    10     //T m_vect[N];
    11 }Stack;
    12 */
    13 //初始化堆栈   申请动态内存
    14 void init(Stack *stack,size_t size){
    15     stack->m_vect = calloc(size,sizeof(T));
    16     stack->size = size;
    17     stack->index = 0;
    18 }
    19 
    20 //把data这个元素放到堆栈中去
    21 void push(Stack *stack,T data){
    22     stack->m_vect[stack->index] = data;
    23     stack->index++;
    24 }
    25 
    26 //从堆栈中取到一个元素  该元素是最后放到堆栈中那个元素
    27 T pop(Stack *stack){
    28     return stack->m_vect[--stack->index];    
    29 }
    30 
    31 //查看堆栈顶的元素  并不拿走
    32 T peek(Stack *stack){
    33     return stack->m_vect[stack->index-1];    
    34 }
    35 
    36 //堆栈是否为空
    37 bool isEmpty(Stack *stack){
    38     /*if(stack->index == 0){
    39         return true;    
    40     }else{
    41         return false;    
    42     }*/
    43     return stack->index == 0;    
    44 }
    45 
    46 //堆栈中存储元素的个数
    47 size_t getCnt(Stack *stack){
    48     return stack->index;    
    49 }
    50 
    51 //堆栈中容量的大小
    52 size_t getSize(Stack *stack){
    53     return stack->size;    
    54 }
    55 
    56 //堆栈是否已经满了
    57 bool isFull(Stack *stack){
    58     return stack->size == stack->index;    
    59 }
    60 
    61 //销毁堆栈
    62 void destroy(Stack *stack){
    63     if(stack->m_vect != NULL){
    64         free(stack->m_vect);
    65         stack->m_vect = NULL;
    66     }
    67 }
    68 //清空堆栈中的元素
    69 void clear(Stack *stack){
    70     while(!isEmpty(stack)){
    71         pop(stack);    
    72     }
    73 }
    74 //遍历一下堆栈中的元素
    75 void travel(Stack *stack){
    76     for(int i=0;i<stack->index;i++){
    77         printf("%d ",stack->m_vect[i]);    
    78     }    
    79     printf("
    ");
    80 }
    81 //判断brr是否是arr作为入栈的出栈顺序
    82 bool isOutOfStack(T arr[],T brr[],size_t len){
    83     Stack s;
    84     init(&s,len);
    85     int j = 0;//记录brr[]数组下标位置
    86     for(int i=0;i<len;i++){
    87         push(&s,arr[i]);//把入栈元素依次入栈
    88         while(!isEmpty(&s) && peek(&s)==brr[j]){//一旦栈顶元素等于出栈元素 
    89             pop(&s);//出栈
    90             j++;    //下一个出栈元素
    91         }
    92     }
    93     bool flag = isEmpty(&s);//栈里面元素全部都出列了 
    94     destroy(&s);
    95     return flag;
    96 }
  • 相关阅读:
    思维发散的双刃剑
    一个请求过来都经过了什么?(Thrift版)
    业务开发转基础开发,这三种「高可用」架构你会么?
    程序常用的设计技巧
    美团分布式服务通信框架及服务治理系统OCTO
    《程序员修炼之道》解读
    面试官说:你真的不是不优秀只是不合适
    架构视角-文件的通用存储原理
    那些影响深远的弯路
    iOS sqlite ORM框架-LKDBHelper
  • 原文地址:https://www.cnblogs.com/jiangyu0331/p/11653072.html
Copyright © 2020-2023  润新知