数据结构(四)

来源:互联网 发布:软件注册dll文件 编辑:程序博客网 时间:2024/04/30 00:52

--接着栈。

栈的算法:出栈

          压栈

不管怎么操作,栈都遵循先进后出,出栈是后进来的先出,压栈是先进来的放最底下。

 

下面是栈的一些算法实现代码:


# include <stdio.h># include <malloc.h># include <stdlib.h>typedef struct Node{int data;struct Node * pNext;}NODE,* PNODE;typedef struct Stack{PNODE pTop;PNODE pBottom;}STACK,* PSTACK;//函数声明void init(PSTACK pS);//初始化void push(PSTACK pS,int val);//压栈void traverse(PSTACK pS);//遍历bool pop(PSTACK pS,int * pVal);//出栈bool clear(PSTACK pS);//清空int main(void){int val;STACK S;printf("*******压栈******");init(&S);push(&S,1);push(&S,2);push(&S,3);push(&S,4);push(&S,5);push(&S,6);traverse(&S);printf("*******出栈******");    pop(&S,&val);    traverse(&S);printf("*******清空******");clear(&S);traverse(&S);return 0;}void init(PSTACK pS){pS->pTop=(PNODE)malloc(sizeof(NODE));if(NULL == pS->pTop){printf("动态内存分配失败!\n");}else{pS->pBottom = pS->pTop;}}void push(PSTACK pS,int val){PNODE pNew = (PNODE)malloc(sizeof(NODE));pNew->data=val;pNew->pNext=pS->pTop;pS->pTop=pNew;return;}void traverse(PSTACK pS){PNODE p=pS->pTop;printf("\n******遍历*******\n");while(p!=pS->pBottom){printf("%d   ",p->data);p=p->pNext;}printf("\n");return;}bool empty(PSTACK pS){if(pS->pTop == pS->pBottom){return true;}else{return false;}}bool pop(PSTACK pS,int * pVal){if(empty(pS)){return false;}else{PNODE r=pS->pTop;*pVal=r->data;pS->pTop=r->pNext;free(r);r=NULL;return true;}}bool clear(PSTACK pS){if(empty(pS)){return false;}else{PNODE p=pS->pTop;PNODE q=NULL;while(p!=pS->pBottom){q=p->pNext;free(p);p=q;}pS->pTop=pS->pBottom;return true;}}



栈的实际应用:函数调用

              中断

              表达式求值

              内存分配

              缓冲处理

              迷宫

              ...

 

队列:与栈不同,队列是”先进先出“类型的存储结构,而且是从不同口进出。类似火车站,从一个入口进去,从另外一个出口出来。

类型:链式队列

      静态队列:通常是循环队列

队列的算法:出队

            入队

循环队列的讲解:1.静态队列为什么必须是循环队列

                  由于队列是“先进先出”,当增加一个元素时,是在rear前添加,删除              一个元素时,是删除front后面的元素。如果队列不循环,在添加和删除时,frontrearindex值都是往上增加的,会造成内存泄漏,所以静态队列必须采用循环队列。比如,一个队列现有6个元素,front1rear6,(第6个是无效的,只是方便操作),增加一个元素7,那么rear就变成7了,删除1front就变成2,原先frontrear16,现在是27,而内存中16并没有被释放。

 

                2.循环队列需要几个参数来确定

                front

                rear

               3. 循环队列各个参数的含义

                2个参数在不同场合有不同意义:

                1.)队列初始化

                front 和 rear 的值都是零

                2.)队列非空

                front代表队列第一个元素

                Rear代表队列最后一个有效元素的下一个元素

                3.)队列空

                frontrear的值相等,但不一定是零(下面简称fr

                4.循环队列入队伪算法

                (1.将值存入r所代表的位置

                (2.r在数组的位置改为 r=(r+1)%(数组的长度),不能是r=r+1

                5.循环队列出队伪算法

                (1.将值存入f所代表的位置

                (2.r在数组的位置改为 f=(f+1)%(数组的长度),不能是f=f+1

                6.判断循环队列是否为空

                 如果rf的值相等,则该队列就一定为空

                7.判断循环队列是否已满

                fr的关系是不确定的,在入队和出队过程中,f可能比r大,f可能等                             于rf可能小于r

                于是有两种方式可以实现:

               (1)多增加一个标识参数

               (2)定义的数组少用一个元素(通常用第二这种方法)

                如果rf的值紧挨着,则队列已满

                If((r+1)%数组的长度==f)

                {  已满;  }

                Else

                {  未满;  }


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开车上班总有蹭车的怎么办 食堂的饭难吃怎么办 租亲戚的房子怎么办 饭菜罩子生虫怎么办 食堂吃出虫子怎么办 缺氧没有煤炭了怎么办 缺氧没有金属了怎么办 白色衣服带红色怎么办 如果买方退回假货怎么办 饰品氧化变黑了怎么办 银放久了变黄怎么办 真银变色了怎么办 古装头饰变色了怎么办 液晶电视遥控器坏了怎么办 纯银手镯发黑怎么办 银色项链黑了怎么办 线切割割铜割不动怎么办 楼房一直不动工怎么办 买火车票待审核怎么办 太原动车月票怎么办 发票上没有日期怎么办 火车没有坐票怎么办 如果买到无座的火车票怎么办 动车票来不及去怎么办 火车票被洗了怎么办 进站后走错站台怎么办 高铁票迟到了怎么办 12306生日错了怎么办 账号未通过核验怎么办 高铁票购票失败怎么办 天际线没有人口需求怎么办 复兴号 锁 区间 怎么办 地板砖上铺木地板门怎么办 高考座位号没涂该怎么办 一个人带小孩很累很烦怎么办 收割机麦立怎么办漏 买到火车无座票怎么办 学高铁乘务员身高不够怎么办 动车买了无座票怎么办 坐火车无座怎么办 长途火车无座怎么办