1
1
mirror of https://github.com/ParkMoonJ/KaoYan.git synced 2026-11-05 07:08:26 +08:00

Update 3 栈和队列.md

This commit is contained in:
ParkMoonJ
2021-04-08 21:05:04 +08:00
parent 57d4d5ef12
commit 9f14a0ba08

View File

@@ -1,7 +1,5 @@
# 第 3 章 栈和队列
[toc]
## 一、基本内容
栈和队列的结构特性;在两种存储结构上如何实现栈和队列的基本操作以及栈和队列在程序设计中的应用。
@@ -345,27 +343,96 @@ $$
### 3.25 试写出求递归函数 $F(n)$ 的递归算法,并消除递归:
$$
F(n) = \begin{cases} n + 1 & n = 0 \\ n \cdot F(n / 2) & n > 0 \end{cases}
F(n) =
\begin{cases}
n + 1 & n = 0 \\
n \cdot F(n / 2) & n > 0
\end{cases}
$$
```cpp
int function(int n) {
if (n == 0) {
return 1;
} else {
function(n / 2);
}
}
```
```cpp
int function(int n) {
while (n) {
n = n / 2;
}
return 1;
}
```
### 3.26 求解平方根 $\sqrt{A}$ 的迭代函数定义如下:
$$
sqrt(A, p, e) = \begin{cases} p & |p^2 - A| < e \\ sqrt(A, \frac{1}{2}(p + \frac{A}{p}), e) & |p^2 - A| \ge e\end{cases}
sqrt(A, p, e) =
\begin{cases}
p & |p^2 - A| < e \\
sqrt(A, \frac{1}{2}(p + \frac{A}{p}), e) & |p^2 - A| \ge e
\end{cases}
$$
### 其中,$p$ 是 $A$ 的近似平方根,$e$ 是结果允许误差。试写出相应的递归算法,并消除递归。
```cpp
int function(int A, int p, int e) {
if (abs(p * p - A) < e) {
return p;
} else {
function(A, (p + A / p) / 2, e);
}
}
```
```cpp
int function(int A, int p, int e) {
while (p * p - A) >= e) {
p = (p + A / p) / 2;
}
return p;
}
```
### 3.27 已知 Ackerman 函数的定义如下:
$$
akm(m, n) = \begin{cases} n + 1 & m = 0 \\ akm(m - 1, 1) & m \ne 0,n = 0 \\ akm(m - 1, akm(m, n - 1)) & m \ne 0,n \ne 0 \end{cases}
akm(m, n) =
\begin{cases}
n + 1 & m = 0 \\
akm(m - 1, 1) & m \ne 0,n = 0 \\
akm(m - 1, akm(m, n - 1)) & m \ne 0,n \ne 0
\end{cases}
$$
#### (1)写出递归算法;
```cpp
int akm(int m, int n) {
if (!m) {
return n + 1;
} else {
if (!n) {
akm(m - 1, 1);
} else {
akm(m - 1, akm(m , n - 1));
}
}
}
```
#### (2)写出非递归算法;
```cpp
```
#### (3)根据非递归算法,画出求 $akm(2, 1)$ 时栈的变化过程。
### 3.28 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。