数制的转换
- 案例分析: 当一个十进制整数N转换为八进制数时,在计算过程中,把N与8求余得到的八进制数的各位依次进栈,计算完毕后将栈中的八进制数依次出栈输出,输出结果就是待求得的八进制数。
- 案例实现:栈可以采用顺序存储表示也可以采用链式存储表示。
-
-
算法步骤:
- ① 初始化一个空栈S。
-
② 当十进制数N非零时,循环执行以下操作:
- 把N与8求余得到的八进制数压入栈S;
- N更新为N与8的商。
-
③ 当栈S非空时,循环执行以下操作:
- 弹出栈顶元素e;
- 输出e。
- 算法描述
/**
* @brief 栈的应用 ------ 进制转换
* 对任意一个非负十进制数,打印输出与其等值的八进制数。
*/
void conversion(int N)
{
InitStack(S); //初始化空栈 S
int e;
while (N) //当N非零时,循环
{
Push(S, N % 8); //把N与8求余得到的八进制数压入栈S
N = N / 8; //N更新为N与8的商。
}
while (!StackEmpty(S)) //当栈S非空时,循环执行
{
Pop(S, e); //弹出栈顶元素e
cout << e; //输出e
}
}
匹配括号的检验
- 案例分析: 检验算法借助一个栈,每当读入一个左括号,则直接入栈,等待相匹配的同类右括号;每当读入一个右括号,若与当前栈顶的左括号类型相同,则二者匹配,将栈顶的左括号出栈,直到表达式扫描完毕。
- 案例实现:栈可以采用顺序存储表示也可以采用链式存储表示。
-
-
算法步骤:
- ① 初始化一个空栈S。
- ② 设置一标记性变量flag,用来标记匹配结果以控制循环及返回结果,1表示正确匹配,0表示错误匹配,flag初始值为1。
-
③ 扫描表达式,依次读取字符ch,如果表达式没有扫描完毕且flag非零,则循环执行以下操作:
- 若ch是左括号“(”、“[”、“{”,则将其压入栈;
- 若ch右括号“}”,则根据当前栈顶元素的值分情况考虑;若栈非空且栈顶元素是“{”,则正确匹配,否则错误匹配,flag置为0;
- 若ch右括号“]”,则根据当前栈顶元素的值分情况考虑;若栈非空且栈顶元素是“[”,则正确匹配,否则错误匹配,flag置为0;
- 若ch右括号“)”,则根据当前栈顶元素的值分情况考虑;若栈非空且栈顶元素是“(”,则正确匹配,否则错误匹配,flag置为0;
- 若ch右括号“)”,则根据当前栈顶元素的值分情况考虑;若栈非空且栈顶元素是“(”,则正确匹配,否则错误匹配,flag置为0;
- ④ 推出循环后,如果栈空且flag值为1,则匹配成功,返回true,否则匹配失败,返回false。
- 算法描述
/**
* @brief 检验表达式中所含括号是否正确匹配
*
* @return true 正确匹配
* @return false 错误匹配
*/
bool Matching()
{
LinkStack S;
InitStack(S); //初始化空栈
int flag = 1; //标记匹配结果以控制循环及返回结果
cin >> ch; //读入第一个字符
while (ch != '#' && flag)
{
switch (ch)
{
case '{': //若为左括号,将其压入栈
case '[':
case '(':
Push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') //若为右括号,且栈非空,检查栈顶元素是否匹配
Pop(S, x); // 正确匹配,出栈
else
flag = 0; //错误匹配,记录结果,返回
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[')
Pop(S, x);
else
flag = 0;
break;
case '}':
if (!StackEmpty(S) && GetTop(S) == '}')
Pop(S, x);
else
flag = 0;
break;
default:
break;
}
cin >> ch; //继续读入下一个字符
}
if (StackEmpty(S) && flag) //匹配成功
return true;
else //匹配失败
return false;
}
递归算法求阶乘
计算正整数的阶乘n!
f
a
c
t
o
r
i
a
l
(
n
)
=
{
n
∗
f
a
c
t
o
r
i
a
l
(
n
−
1
)
,
n
>
1
1
,
n
=
1
1
,
n
=
1
factorial(n)=\begin{cases} n * factorial(n-1) , & n > 1\\ 1, & n = 1\\ 1, & n = 1 \end{cases}
factorial(n)=⎩
⎨
⎧n∗factorial(n−1),1,1,n>1n=1n=1
- 算法描述
/**
* @brief 栈的应用 ------ 递归算法求阶乘
* 计算正整数 n!
*/
int factorial(int n)
{
if (n == 0 || n == 1)
return 1;
else
return n * factorial(n - 1);
}
int main()
{
int n = 10;
int x = factorial(n);
printf("n!%d= %d", n, x);
return 0;
}
递归算法求斐波那契数列
斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…
这个数列从第3项开始,每一项都等于前两项之和。
F
i
b
(
n
)
=
{
F
i
b
(
n
−
1
)
+
F
I
b
(
n
−
2
)
,
n
>
1
1
,
n
=
1
0
,
n
=
0
Fib(n)=\begin{cases} Fib(n-1)+FIb(n-2) , & n > 1\\ 1, & n = 1\\ 0, & n = 0 \end{cases}
Fib(n)=⎩
⎨
⎧Fib(n−1)+FIb(n−2),1,0,n>1n=1n=0
- 算法描述
int Fib(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n = 7;
int x = Fib(n);
printf("斐波那契数列的第%d项值为:%d", n,x);
return 0;
}