`
韩悠悠
  • 浏览: 840664 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据结构3

    博客分类:
  • java
 
阅读更多

 

栈和队列

 

1,栈的类型定义

 

ADT Stack{

 

         数据对象:

 

         D={a1|ai=elementSet,i=1,2,,,,,,n,n>=0}

 

         数据关系

 

         R1={<ai-1,ai>|ai-1,ai=D,i=2,,,,,n}

 

         约定an端为栈顶,a1端为栈底

 

}

 

 

 

基本操作:

 

InitStack(&s)

 

操作结果:构造一个空的栈S

 

DestroyStack(&s)

 

初始条件:栈S已存在

 

操作结果:栈S被销毁

 

StackEmpty(s)

 

初始条件:栈S已经存在

 

操作结果:如果栈S存在,返回TRUE,否则返回FALSE

 

StackLength(s)

 

初始条件:栈S已存在

 

操作结果:返回S的元素个数,即栈的长度

 

GetTop(S,&e)

 

初始条件:栈S已存在且非空

 

操作结果:用e返回S的栈顶元素

 

ClearStack(&s)

 

初始条件:栈S已存在

 

操作结果:将S清为空栈

 

Push(&s,e)

 

初始条件:栈S已经存在

 

操作结果:插入元素e为新的栈顶元素

 

Pop(&s,&e)

 

初始条件:栈S已经存在且非空

 

操作结果:删除S的栈顶元素,并用e返回其值

 

 

 

 

 

栈的应用举例

 

1、数值转换

 

2、括号匹配的检验

 

3、行编辑程序问题

 

4、迷宫求解

 

5、表达式求值

 

6、递归实现

 

 

 

 

 

数制转换

 

算法基本原理

 

N=(N div d) * d+ N mod d

 

例如:(1345) =(2504)的八进制,其运输过程如下:

 

N      N div 8     N mod 8

 

1348      168                4

 

168    21             0

 

21       8              5

 

2        0               2

 

 

 

计算输出的结果和显示结果相反,所以用栈

 

void converson(){

 

         InitStack(S);

 

         scanf("%d",N);

 

         while(N){

 

                   Push(S,N%8);

 

                   N=N/8;

 

         }

 

         while(!StackEmpty(S)){

 

                   Pop(S,e);

 

                   printlf("%d",e);

 

         }

 

}

 

 

 

 

 

括号匹配的检验

 

( [ ] ( ) )[ ( [ ] [ ] ) ]等为正确的格式。

 

[ ( ] ) ( [ () ]均为不正确的格式,

 

检验括号是否匹配的方法用“期待的急迫程度”这个概念来描述,例如考虑下面的括号序列在

 

[ ( [ ] [ ] ) ]

 

1 2 3 4 5 6 7 8

 

 

 

分析可能出现的不匹配的情况:

 

到来的右括号非是所“期待”的

 

到来的是“不速之客”

 

直到结束,也没有到来所“期待”的。

 

 

 

算法的设计思想

 

1,凡出现左括号,则进栈

 

2、凡是出现右括号,首先检查栈是否为空,若栈空,则表明“右括号”多了,否则和栈顶元素比较,若想匹配,则“左括号”出栈,否则不匹配。

 

3、表达式检验结束时,若,空栈,则匹配正确。否则表明“左括号”多了。

 

Status matching(string &exp){

 

int state=1;

 

         while(i<=length(exp)&&state){

 

                   case 左括号:{

 

                            Push(S,exp[i];

 

                            i++;

 

                            break;

 

                   }

 

                   case ")":{

 

                            if(NOT StackEmeptY(s)&&GetTop(S)=="("){

 

                                     Pop(S,e);

 

                                     i++;

 

                            }else{

 

                                     state=0;

 

                            }

 

                   }

 

         }

 

}

 

 

 

 

 

迷宫求解

 

通常用的是“穷举求解”的方法

 

基本思想是:

 

1、若当前位置“可通”,则纳入路径,继续前进

 

2、若当前位置“不可通”,则后退,换向探索

 

3、若四周均“不可通”,则从路径中删除

 

 

 

从迷宫中一条从入口到出口的路径的算法:

 

设定当前位置的初始为入口位置;

 

do{

 

         若当前位置可同,

 

         {

 

                   将当前位置插入栈顶

 

                   若改位置是出口位置,则结束

 

                   否则切换当前位置的东邻方块为新的当前位置。

 

         }否则{

 

                   若栈不为空且栈顶位置尚有其他方向未被探索,则设定新的当前位置为:延顺时针方向旋转找到的栈顶位置的下一相邻块;

 

                   若栈不为空但栈顶位置的四周均不可通。

 

                   {

 

                            删去栈顶位置;//从路径中山区该通道块

 

                            若栈不空,则重新测试新的栈顶位置

 

                            直到找到一个可通的相邻块或出栈至栈空。

 

                   }

 

         }

 

}

 

 

 

 

 

 

 

表达式求值

 

限于二元运算符的表达式定义:

 

表达式::=(操作数)+(运算符)+(操作数)

 

操作数:=简单变量|表达式

 

简单变量:=标示符|无符号整数

 

 

 

在计算机中,表达式可以有三种

 

不同的标示方法

 

Exp =S1+OP+S2

 

则称 OP+S1+S2为表达式的前缀表示法

 

S1+OP+S2为表达式的中缀表示法

 

S1+S2+OP为表达式的后缀表示法

 

 

 

可见,它以表达式所在不同位置命名的。

 

 

 

 

 

例如:Exp=a*b+(c-d/e)*f

 

前缀式:+*ab*-c/def

 

中缀式:a*b+c-d/e*f

 

后缀式:ab*cde/-f*+

 

 

 

结论:

 

1,操作数之间的相对次序不变

 

2,运算符的相对次序不同

 

3,中缀式丢失了括弧信息。致使运算的次序不确定。

 

4,前缀式的运算规则为:连续出现的俩个操作数和在它们之前且紧靠它们的运算符构成了一个最小表达式。

 

5、后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的俩个操作数构成一个最小表达式。

 

 

 

如何从后缀式求值?

 

先找运算符,再找操作数

 

 

 

如何从原表达式求得后缀式?

 

分析“原表达式”和“后缀式”中的运算符

 

原表达式:a+b*c-d/e*f

 

后缀式:abc*+de/f*-

 

每个运算符的运算次序要由它之后的一个运算符来定,在后缀式中,优先数高的运算符领先于优先数低的运算符。

 

 

 

从原表达式求得后缀式的规律为:

 

1,设立操作数栈

 

2,设表达式的结束符为#,予设运算符栈的栈底为#

 

3,若当前字符是操作数,则直接发送给后缀式,

 

4,若当前运算符的优先数高于栈顶运算符,则进栈

 

5,否则,退出栈顶运算符发送给后缀式

 

6,“(”对它之前后的运算符起隔离作用,“)”可视为自相应左括号开始的表达式。

 

 

 

 

 

递归实现

 

当在一个函数的运行期间调用另一个函数时,在运行该被调用函数之前,需要完成三件事

 

1,将所有的实在参数,返回地址等信息传递给被调用函数保存。

 

2,为被调用函数的局部变量分配存储区

 

3,将控制转移到被掉函数的入口。

 

 

 

 

 

从被调用函数返回调用函数之前,应该完成:

 

1,保存被调用函数的计算结果;

 

2,释放被调函数的数据区

 

3,依照被调函数保存的返回地址将控制转移到调用函数

 

多个函数嵌套调用的规则是:

 

后调用先返回,此时的内存管理实行“栈式管理”

 

                  

 

分享到:
评论

相关推荐

    数据结构3.exe

    数据结构3.exe

    北京科技大学数据结构实验

    3. **图数据结构**:可能包括邻接矩阵和邻接表来表示图,以及相关的算法,如深度优先搜索(DFS)和广度优先搜索(BFS)。 4. **排序与查找**:快速排序、归并排序、冒泡排序、插入排序、二分查找等。这些算法的实现...

    220913201郭博宇数据结构3.docx

    220913201郭博宇数据结构3.docx

    数据结构3-1.cpp,实验课作业

    数据结构3-1.cpp,实验课作业

    算法与数据结构(第3版)--张乃孝 光盘内容

    算法与数据结构(第三版)的光盘内容。自己从光盘上导出来的,打开需要安装office、pdf reader和视频播放器。因为限制的上传文件大小,所以把网盘链接+提取码发上

    数据结构 数据结构 数据结构 数据结构 数据结构

    3. **栈**:栈是一种后进先出(LIFO)的数据结构,主要用于临时存储和处理数据。常见的栈应用有函数调用、表达式求值和深度优先搜索等。 4. **队列**:队列是一种先进先出(FIFO)的数据结构,常用于模拟等待服务的...

    上海交大数据结构课件 上海交大数据结构课件

    数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中高效地组织和存储数据,以便于进行各种操作。上海交通大学的数据结构课件是学习这一主题的重要资源,它涵盖了广泛的知识点,帮助学生深入理解数据结构...

    严蔚敏数据结构动态演示

    3. 不同数据结构在解决实际问题时的适用性,如搜索、排序、存储等。 4. 算法的执行流程,加深对算法的理解。 总的来说,"严蔚敏数据结构动态演示"是一个宝贵的资源,它为学习和教学数据结构提供了一个生动、直观的...

    数据结构的pdf课件

    3. **非线性数据结构**:包括栈、队列、树和图。栈是一种后进先出(LIFO)的数据结构,常用于表达式求值和递归;队列则是先进先出(FIFO)的结构,常见于任务调度。树(如二叉树、平衡树)和图则用于表示复杂关系,...

    西安理工大学863数据结构真题 -西安理工大学863数据结构真题需要的滴滴我,都是我去年备考时的真题资料,还有复试资料哦~

    3. 栈(Stack):是一种后进先出的数据结构,元素的添加和删除操作都在栈顶进行。 4. 队列(Queue):是一种先进先出的数据结构,元素的添加和删除操作分别在队列的末尾和头部进行。 5. 树(Tree):是一种树形结构...

    数据结构1800试题.pdf

    3. **数据结构的术语**: - **栈**和**队列**:栈是一种后进先出(LIFO)的数据结构,而队列是先进先出(FIFO)的。它们在程序设计中广泛应用,如递归、函数调用和任务调度。 - **哈希表**:通过散列函数快速查找...

    数据结构实验2.1:二叉树的先序创建、先序遍历、中序遍历、后序遍历.doc

    数据结构实验报告

    王红梅数据结构答案.pdf

    "数据结构基础知识点" 数据结构是计算机科学中的一门重要学科,研究如何组织、存储和处理数据的方法和技术。本资源摘要信息将涵盖数据结构的基本概念、数据元素、数据结构的分类、算法的基本特性、数据存储结构、...

    《初识数据结构》教学建议.pdf

    ### 数据结构的基本概念 数据结构是计算机存储、组织数据的方式。它旨在使数据的存取和处理更加高效。数据结构通常由数据对象和数据关系两部分构成。数据对象是指具有相同数据类型的元素的集合;数据关系则定义了...

    C++数据结构与程序设计

    《C++数据结构与程序设计》作为一部计算机科学与工程领域的基础性核心课程著作,专注于C++语言环境下数据结构与算法的教学与应用。这本书在内容实用性、编写体例和结构布局方面都显示出其独到之处,不仅适合高校师生...

    浙江大学陈越数据结构课件

    3. **栈和队列**:栈是一种后进先出(LIFO)的数据结构,常用于表达式求值和函数调用等场景。队列则是先进先出(FIFO)的结构,适用于任务调度和打印队列等应用。 4. **树形结构**:二叉树、平衡树(如AVL树和红黑...

    数据结构(唐发根)

    3. **栈与队列**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景。队列是先进先出(FIFO)的数据结构,适用于任务调度、打印队列等。 4. **树形结构**:树是层次化的数据结构,包括二叉树...

    Java常见数据结构面试题(带答案)

    "Java常见数据结构面试题(带答案)" 以下是对Java常见数据结构面试题的知识点总结: 栈和队列 * 栈和队列的共同特点是只允许在端点处插入和删除元素。 * 栈通常采用的两种存储结构是线性存储结构和链表存储结构...

    数据结构习题解析唐发根

    《数据结构习题解析》由唐发根编著,是为高等教育学历文凭考试计算机专业考生提供的辅导教材。该书与唐发根所著的主教材《数据结构》配套使用,内容上严格对应主教材的章节顺序,每章节都涵盖了学习要点、习题解析及...

    考研王道数据结构代码.zip

    3. 栈与队列:栈是后进先出(LIFO)的数据结构,常用于表达式求值、递归和回溯等问题;队列是先进先出(FIFO)的数据结构,常见于任务调度和消息传递。 4. 树:树结构模拟了层次关系,如二叉树、平衡二叉树(AVL、...

Global site tag (gtag.js) - Google Analytics