• 数据结构,到底如何用中学,学中用?


         说真的,上大学时数据结构老师每上完一次课,自己都需要花好长时间来理解,但理解好多次还是迷惑;现在工作了好多年做.net(C#)开发,经常用到数据结构方面的知识,就不停地翻看、用中体会总结,才明白数据结构的作用,及如何学好。

    疑惑:

         数据结构是比较抽象,而且书中给出好多伪代码,虽然老师一再讲的很卖力,我还是只能勉强明白,至于如何就在电脑上实现了,看到真真的执行结果呢,实际项目中又如何用呢? 

    项目中:.net开发项目(如vs2012中)中,用到栈时,按F1帮助文档,出来stack类的属性、方法等(按理说,微软已帮你实现了功能,你只需要调用就可以了,但是有时项目中的功能实现了,下次碰到类似的功能,心里还是不明白,弄不通就没法变通,那怎办?    下面将以顺序栈的实现来理解栈) 

         

    学习方法:下面将演示如何实现顺序栈的实现

    实现:工具vc6.0,c语言

    示例: 顺序栈的实现 (入栈、出栈操作,涉及到栈空、栈满的操作)

    分析:栈是仅在表尾进行插入或删除操作的线性表。(表尾操作:称为栈顶

            顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。

    思路:(用语言写出自己的思路很重要,不要认为书上已经写了,那是编书作者的思路,不是你的;我是明白了原理后,自己写出来的主函数执行流程(如下图)

    
    

       

    实现代码:(C语言实现的)

     1 //*自己写的
     2   顺序栈:用数组实现
     3 */
     4 #include <stdio.h>
     5 #include <string.h>
     6 #define MaxNum 5
     7 char chE;
     8 
     9 typedef struct stack{
    10     int top;
    11     int base;
    12     char ch[MaxNum];
    13 }stack;
    14 
    15 
    16 void iniStack(stack *s);
    17 int  push(stack *s,char chE);   //返回入栈 标志
    18 int pop(stack *s);
    19 
    20 void main()
    21 {
    22     int i=0,inFlag,outFlag,j;
    23     char chArr[MaxNum];
    24     stack s;
    25     printf("用数组实现顺序栈
    ");
    26     iniStack(&s);
    27     
    28     printf("按1进行入栈操作
    ");
    29     printf("按2进行出栈操作
    ");
    30     printf("按3结束,请选择操作
    ");
    31     scanf("%d",&i);
    32     while(i!=3)
    33     {
    34        switch(i)
    35        {
    36          case 1:
    37              {             
    38               printf("请输入入栈元素
    ");
    39               gets(chArr);
    40               for(j=0;j<strlen(chArr);j++)
    41               {                    
    42                   inFlag=push(&s,chArr[j]);
    43                   if(inFlag==1)   printf("栈已满
    ");                  
    44               }
    45               break;
    46              }
    47         case 2:
    48             {
    49              outFlag=pop(&s);
    50              if(outFlag==1)
    51                 printf("栈已空
    ");
    52              else
    53                 printf("出栈元素为%c
    ",chE);
    54              break;
    55             }
    56        }
    57        printf("按3结束,请选择操作
    ");
    58        scanf("%d",&i);   
    59     }    
    60 }
    61 
    62 void iniStack(stack *s)
    63 {
    64     s->top=0;       //base top指向相同的起始位置
    65     s->base=0;
    66 }
    67 int  push(stack *s,char chE)
    68 { 
    69     int flag;
    70     if(s->top >= MaxNum) 
    71     {        
    72         flag=1;
    73     }
    74     else
    75     {   
    76         s->ch[s->top]=chE;
    77         s->top=s->top+1;    //top指向栈顶元素的下一个位置
    78         flag=0;
    79     }
    80     return flag;
    81 }
    82 int pop(stack *s)
    83 {
    84    int pFlag;
    85    if(s->top==s->base) 
    86    {      
    87       pFlag=1;
    88    }
    89    else
    90    {
    91        s->top=s->top-1;
    92        chE=s->ch[s->top];  
    93        pFlag=0;
    94    }
    95    return pFlag;
    96 }

           经过了以上练习后,明白栈的工作原理,调用其方法就简单了。

           

  • 相关阅读:
    Windows Mobile 6 sdk installation error, COM3 in use,please check the implementation
    使用lock_sga和pre_page_sga参数保证SGA常驻物理内存 .
    Davinci开发板DM368 nandwrite.c简要分析
    归并排序的实现
    ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug
    cocos2d-x绑定ccb文件
    产品经理的工作感想(3)
    9年经验,总结SEO职业瓶颈
    关于C++中的拷贝构造函数和赋值函数
    实现怎样支持Android重力感应器Sensor编程
  • 原文地址:https://www.cnblogs.com/2010dream/p/6082312.html
Copyright © 2020-2023  润新知