数据结构队列 (1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上堂课要点回顾z栈
–栈的定义、特征、抽象数据类型–顺序栈、单链栈的基本操作实现–栈的应用*
z1、括号匹配
z2、计算算术表达式的值
递归示例:2阶斐波那契数列
z 递归函数必须包含一个递归出口。
z
递归调用部分所使用的参数值应比函数的参数值要小,以便重复调用能最终获得基本部分所提供的值。
⎪⎩
⎪
⎨⎧
>−+−===1n )2()1(1n 10n 0)(n Fib n Fib n Fib int Fibonacci(int n){if(n ==0) return 0;
if(n ==1) return 1;int oneBack =1;
int twoBack =0;
for(int i=2;i<=n;i ++){
int current=oneBack+twoBack ;twoBack =oneBack ;oneBack =current;}return current;}//时间复杂度:O(n)int Fibonacci(int n){if(n ==0) return 0;
if(n ==1) return 1;
return Fibonacci(n -1)
+Fibonacci(n -2);
}//时间复杂度为O (2n )
long fact(int n)
使用循环迭代方法,计算n!的函数{ long m=1;int i;for(i=1;i<=n;i++)
m=m*i;return m;
时间复杂度:O(n)long Fact(int n){ long y;
if (n<0) reurn -1;if (n==0) return 1;else
{y=Fact(n -1);
return n*y;
}
}////时间复杂度:O(n)
适宜于用递归算法求解的问题的充分必要条件是:(1)问题可借用类同自身的子问题进行描述;(2)某一有限步的子问题(也称作本原问题)有直接的解存在。
当一个问题存在上述两个基本要素时,该问题的递归算法的设计方法是:
(1)把对原问题的求解设计成包含有对子问题求解的形式;
(2)设计递归出口。
3.3.2 队列的抽象数据类型
ADT Queue
数据元素:a i ,i=0,1,…,n-1 (n ≥0),类型为DataType 结构:对所有的数据元素a i (0≤i ≤n-2)存在次序关系
, a 0无前趋,a n-1无后继。逻辑操作:设Q 为Queue 型
QueueInitiate(Q) //构造一个空队列Q 。
QueueNotEmpty(Q) /*判断队列Q 非空否,若Q 非
空,则返回1,否则返回0。*/
QueueAppend(Q, x) /*在队列Q 的队尾插入一值为x
的元素,插入成功返回1,失败返回0。*/
QueueDelete(Q, x) /*删除队列Q 的队头元素,被删除
的队头元素通过x 带回,删除成功返回1,失败返回0。*/
QueueGet(Q, x) //取队列Q 的队头元素并由x 带回。
*/
Q->front D
E
Q->rear
1
23
4
F
G H
0Q->front
D
E
Q->rear
1234
①入队描述:
Q->rear++;
if (Q->rear==MaxQueueSize)
Q->rear=0;
还可利用数学上的“模(%)运算”来实现上述过程:Q->rear=(Q->rear+1) % MaxQueueSize;
②出队描述:
Q->front++;
if (Q->front==MaxQueueSize)
Q->front=0;
还可利用数学上的“模(%)运算”来实现上述过程:Q→front=(Q→front+1) % MaxQueueSize;
【顺序循环队列的类型定义】
typedef char DataType;
#define MaxQueueSize<队列允许存放的最大元素数typedef struct
{ DataType queue [ MaxQueueSize];
int front;
int rear;
int count; /* 循环队列的当前表长*/
} SeqCQueue;
SeqCQueue Q;
【顺序循环队列的初始化算法】
void QueueInitiate(SeqCQueue*Q)
{
Q->count=0;
Q→rear=0;
Q→front=0;
}
【顺序循环队列的入队算法】
int QueueAppend(SeqCQueue*Q, DataType x)
{ if (Q->count>0 && Q→rear==Q→front)
return 0;
else {
Q→queue[Q→rear]=x;
Q→rear=(Q→rear+1) % MaxQueueSize;
Q->count++;
return 1;
}
}