数据结构,到底如何用中学,学中用?
说真的,上大学时数据结构老师每上完一次课,自己都需要花好长时间来理解,但理解好多次还是迷惑;现在工作了好多年做.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("用数组实现顺序栈\n"); 26 iniStack(&s); 27 28 printf("按1进行入栈操作\n"); 29 printf("按2进行出栈操作\n"); 30 printf("按3结束,请选择操作\n"); 31 scanf("%d",&i); 32 while(i!=3) 33 { 34 switch(i) 35 { 36 case 1: 37 { 38 printf("请输入入栈元素\n"); 39 gets(chArr); 40 for(j=0;j<strlen(chArr);j++) 41 { 42 inFlag=push(&s,chArr[j]); 43 if(inFlag==1) printf("栈已满\n"); 44 } 45 break; 46 } 47 case 2: 48 { 49 outFlag=pop(&s); 50 if(outFlag==1) 51 printf("栈已空\n"); 52 else 53 printf("出栈元素为%c\n",chE); 54 break; 55 } 56 } 57 printf("按3结束,请选择操作\n"); 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 }
经过了以上练习后,明白栈的工作原理,调用其方法就简单了。