数据结构队列 (1)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

}

相关文档
最新文档