北航数据结构课件 (4)
- 格式:pdf
- 大小:809.91 KB
- 文档页数:65
实验报告:栈实现逻辑关键词求值17374347周京成一、问题描述逻辑关键词求值是程序设计语言中的一个基本问题,简单说就是让计算机理解并且接受高级语言描述的概念,这里的处理对象是“”,代表和;“v”代表并;,“~”代表非;“_”代表蕴含;“-”代表当且仅当;“(”,“)”左右括号;以及代表Ture 的数字1和代表False的0按照一定规则构成的合法式子,由于各种运算之间有优先级关系,所以用括号来隔开,所以使用栈来求逻辑表达式的值,这里我们最好输出的是True和False,为了方便,输入的数字只有1和0.二、数据结构:栈由于使用的是python语言,可以不用直接构造一个栈结构,直接使用列表,就可以实现栈的各类操作,比如进栈,出栈等等。
三、算法的设计和实现:1.首先建立两个列表,分别存储读入的数字和字符2.读入数字和字符,当读入右括号“)”,则要计算这个括号里面的运算结果,存储在数字列表中。
3.最后只剩下最多一个字符和两个数字,再进行讨论既可。
四、预期结果与问题预期结果和我们自己运算应该是一致的,例如(~(1_0))^((1v0)-1)=True一般可能的问题:1.在表达式最外面加括号,例如(1^0),则需要判断字符列表是不是为空,来判断这种情况。
2.只数字列表只剩一个数字,这时候也要判断字符列表是不是空,最好再输出。
附:python代码:str1=input()list1=[]//字符列表list2=[]//数字列表for i in str1:if i.isdigit()==True:list2.append(int(i))//判断是不是数字else:if i!=")":list1.append(i)//不是右括号存储else:last=list1.pop()//右括号进行计算,各种栈操作while(last!="("):if last=="^":list2.append(list2.pop() and list2.pop())if last=="v":list2.append(list2.pop() or list2.pop())if last=="~":list2.append(not list2.pop())if last=="_":if (not list2.pop()) and (list2.pop())==True: list2.append(0)else:list2.append(1)if last=="-":if (list2.pop()+list2.pop()) in [0,2]:list2.append(1)else:list2.append(0)last=list1.pop()if list1==[]:print (bool (list2.pop()))//判断字符列表是否为空 else : //输出if list1[0]=="^":print (bool (list2.pop() and list2.pop())) if list1[0]=="v":print (bool (list2.pop() or list2.pop())) if list1[0]=="~":print (bool (not list2[0]))if list1[0]=="_":if (not list2.pop()) and list2.pop()==True : print (False )else :print (True )if list1[0]=="-":if (list2.pop()+list2.pop()) in [0,2]: print (True ) else :print (False )输出样例:中国剩余定理(简单写下):我们只做对于有限多个质数的同余方程组。
《数据结构》讲义(总158页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--《数据结构》讲义第一章:绪论课程:数据结构课题:第一章—小节(共4个课时)什么是数据结构基本概念和术语抽象数据类型的表现与实现算法和算法分析目的要求:理解数据、数据元素、数据项的概念;掌握逻辑结构和存储结构的关系;理解算法的基本概念;学会分析算法的时间复杂性和空间复杂性。
新课重点、难点:数据、数据元素、数据项、时间复杂性和空间复杂性教学方法:课堂讲解、例题演示,课件演示教学内容及过程:……………………………第1-2课时……………………………计算机的应用不再局限于科学计算,更多地用于控制,管理,数据处理等非数值计算的处理工作。
计算机加工处理的对象:数值,字符,表格,图形声音,图象等具有一定结构的数据。
进行程序设计时必须分析待处理的对象的特性及各对象之间存在的关系———产生背景。
什么是数据结构计算机解题步骤:建立数学模型——设计解此数学模型的算法——编制程序——进行测试调整——解答。
其中建立数学模型的实质:找出操作对象之间的关系。
例1. 图书馆书目检索——对应线性关系例2. 博奕树——对应树型关系例3. 交叉路口交通灯管理——对应图状结构。
数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象及它们之间的关系和操作等的学科。
(地位)数据结构的基本概念和术语1. 数据(Data)数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。
换句话说,数据是对客观事物采用计算机能够识别、存储和处理的形式所进行的描述;是计算机加工处理的对象。
包括数值、字符、声音、图象等。
2. 数据元素(Data Element)数据元素是组成数据的基本单位, 是数据集合的个体,在计算机中通常作为一个逻辑整体进行考虑和处理。
一个数据元素可由若干个数据项组成(Data Item)。
3. 数据对象(Data Object)数据对象是性质相同的数据元素的集合,是数据的一个子集。
第四章
堆栈和队列
本章内容4.1堆栈的基本概念
4.2堆栈的顺序存储结构
4.3堆栈的链式存储结构
4.4堆栈的应用举例(习题课)
4.5队列的基本概念
4.6队列的顺序存储结构
4.7队列的链式存储结构
4.1堆栈的基本概念
进栈
退栈后进先出
堆栈的示意图
特殊性1. 其操作仅仅是一般线性表的
操作的一个子集。
2. 插入和删除操作的位置受到
限制。
二.堆栈的基本操作
1. 插入(进栈、入栈)
2. 删除(出栈、退栈)
3. 测试堆栈是否为空
4. 测试堆栈是否已满
5. 检索当前栈顶元素√√√
描述堆栈的顺序存储结构最简单的方法是利用一维数组STACK[ 0..M–1 ]来表示,同时定义一个整型变量(不妨取名为top)给出栈顶元素的位置。
a b c d e
top=4
上溢下溢—当堆栈已满时做插入操作。
—当堆栈为空时做删除操作。
溢出
数组:堆栈:静态结构动态结构
(top=M –1)(top=–
1)
0 1 2 3 M-1
…STACK[0..M -1]
top
0 1 2 3 M-1
……
top
1. 初始化堆栈
void INITIALS( int &top ){
top= –1;}
二. 堆栈的基本算法
0 1 2 3 M-1
……
top
3. 测试堆栈是否已满
0 1 2 3 M-1
…
STACK[0..M-1]
0 1 2 3 4
M -1
a d
c b
…
item
4. 插入(进栈)算法
5. 删除(出栈)算法
0 1 2 3 4 M-1
三. 多栈共享连续空间问题
(以两个堆栈共享一个数组为例)
当i=1时,将
item 插入第1个栈,
当i=2时,将item 插入第2个栈。
插入
top[0]++;
STACK[top[0]]=item ;
top[1]--;
STACK[top[1]]=item ;
i=2
top[0]=top[1]–1
0 1 2 …
M -1
0 1 2 …M -1
算法
算法
当i=1时,删除第1个栈的栈顶元素,当i=2时,删除第2个栈的栈顶元素。
top[0]––;
i=1
top[1]++;
i=2
0 1 2 …
M -1
可
用空间
第1栈栈空的条件删除
top[0]=-1 top[1]=M
第2栈栈空的条件
0 1 2 …
M -1
int POP( SElemType STACK[ ], int top[ ], int i, SElemType item )
{
if(i==1)
if(top[0]==–1)
return 0;
else{
item=STACK[top[0]––];
return 1;
}
else
if(top[1]==M)
return 0;
else{
item=STACK[top[1]++];
return 1;
}
}对第一个栈进行操作对第二个栈进行操作
链接堆栈就是用一个线性链表来实现一个堆栈结构, 同时设置一个指针变量( 这里不妨仍用top表示)指出当前栈顶元素所在链结点的位置。
栈为空时,有top=NULL。
栈顶元素
在一个初始为空的链接堆栈中依次插入元素
A, B, C, D
以后, 堆栈的状态为例
top
void INITIAL( STLink &top ){top=NULL;}
1.堆栈初始化
二.基本算法int EMPTYS( STLink top ){return top==NULL;}
2.测试堆栈是否为空
3.插入(进栈)算法
......
等效于在链表最前面插入一个新结点
4.删除(退栈)算法
......
仍然要判断栈空!
(2)
见习题课(2
)
4.5 队列的基本概念
先进先出一.队列的定义
进队出队
队头元素队尾元素
先进先出
队列的示意图
二. 队列的基本操作
1.队列的插入(进队、入队)
3. 测试队列是否为空
2. 队列的删除(出队、退队)
4. 检索当前队头元素
5. 创建一个空队√√√
特殊性1.其操作仅是一般线性表
的操作的一个子集。
2.插入和删除操作的位置
受到限制。
4.6 队列的顺序存储结构在实际程序设计过程中,通常借助一个一维数组QUEUE[0..M –
1]来描述队列的顺序存储结构,同时,设置
两个变量front 与rear 分别指出当前队头元素与队尾元素的位置。
QUEUE[0..M-1]
0 1 2 3 M -1b c d a e
一.构造原理
队头位置队尾位置
QUEUE[0..M –1]0 1 2 3 4 5 M-1
b c a d 初始时, 队列为空, 有
front= –1rear= –1测试队列为空的条件是
front=rear 约定
front 指出实际队头元素所在位置的前一个位置。
rear 指出实际队尾元素
所在的位置,
void INITIALQ( int &front, int &rear ) {front= –1;rear= –1;
}
1. 初始化队列
3. 插入(进队)算法front rear
item 0 1 M -1
a c d
b
01
2
34M -1M -2::
三.循环队列
把队列(数组)设想成头尾相连的循环表,使得数组前部由于删除操作而导致的无用空间尽可能得到重复利用,这样的队列称为。
循环队列QUEUE[0..M -1]……0 1 2 3 4 ……M -2 M -1留课后学习
front与rear分别指向实际队头和队尾元素
空队对应的链表为空链表,空队的标志是
front = NULL
在一个初始为空的链接队列中依次插入
数据元素A, B, C, D
以后, 队列的状态为
例front rear
队尾元素队头元素
void INITIALQ(QLink &front, QLink &rear){front=NULL;rear=NULL ;
}
二.基本算法
1. 初始化队列
rear -
>link=p;
分两种情
况3. 插入(进队)front =rear =NULL 1
4. 删除(出队)
所谓销毁一个队列是指将队列所对应的链表中所有结点都删除,并且释放其存储空间,使队列成为一个空队(空链表)。
…
rear 归结为一个线性链表的删除
5. 销毁一个队列
一个线性链表的删除
…
…rear
本章内
容小结本章内容小结
堆栈、队列
堆栈、队列的顺序存储结构
堆栈、队列的链式存储结构
堆栈、队列的应用举例
堆栈、队列是特殊线性表(特殊性)
(循环队列)
堆栈、队列的定义
构造原理、特点
对应的插入、删除操作的算法设计
构造原理、特点
对应的插入、删除操作的算法设计
0 1 2 3 4 5 6 7
F G H A B C D E temp
0 1 2 3 4 5 6 7A B C D E F G H
0 1 2 3 4 5 6 7A A B C D E F G
循环右移1位0 1 2 3 4 5 6 7H A B C D E F G 请设计一算法,该算法将数组A[0..n-1]的所有元素循环右移k 个位置。
练习1H 保存
k=3 0 1 2 3 4 5 6 7A B C D E F G H 例。