本文将通过完成以下内容来展示在数据结构中堆栈的应用,代码解释标注全面而且清晰,代码书写也十分规范,适合初学者进行学习,本篇文章算是本人的一些学习记录分享,希望对有需要的小伙伴提供一些帮助~
内容如下:
(1) n阶Hanoi问题递归算法的实现;
(2) n阶Hanoi问题非递归算法的实现;
(3)比较Hanoi问题递归算法和非递归算法的区别;
(4)理解和调试算法3.22表达式求值。
一、n阶Hanoi问题递归算法的实现
(1.1) n阶Hanoi问题递归算法源程序及主要算法说明
#include<iostream>
using namespace std;
int m = 0;
void move(char A, int n, char C)
{
cout << "第" << ++m << "步," << "将编号为" << n << "的圆盘从第" << A << "个柱子上移到第" << C
<< "个柱子上" << endl;
}
//Hanoi塔问题的递归算法
void Hanoi(int n, char A, char B, char C) {
if (n == 1)
move(A, 1, C);
else {
Hanoi(n - 1, A, C, B);
move(A, n, C);
Hanoi(n - 1, B, A, C);
}
}
int main() {
int n;
char a, b, c;
a = '1';
b = '2';
c = '3';
cout << "请输入初始第一个柱子上的圆盘个数:" << endl;
cin >> n;
cout << "将第一个柱子上的圆盘全部移动到第三个柱子上的过程为:" << endl;
Hanoi(n, a, b, c);
return 0;
}
实现结果如下所示:
二、n阶Hanoi问题非递归算法的实现:
# include <stdio.h>
struct stack /* 栈结构定义 */
{ int n; /* 层数 */
char x,y,z; /* x:原点; y:中间点; z:目标点;*/
} sta[200]; /* 定义数组栈sta */
void Hanniota(int n,char fr,char by,char to)
/* n:层数;fr:原点;to:目标点;by:中间点 */
{
int top=-1; /* 初始化栈top=-1 */
int n1,a,b,c; /* n1:层数;a:原点,b:中间点;c:目标点 */
top=top+1;
sta[top].n=n;
sta[top].x=fr;
sta[top].y=by;
sta[top].z=to;
while(top>-1)
{
n1=sta[top].n;
a=sta[top].x;
b=sta[top].y;
c=sta[top].z;
top--;
if(n1>1)
{top++; /* 压栈Hannoi(n1-1,b,a,c) */
sta[top].n=n1-1;
sta[top].x=b;
sta[top].y=a;
sta[top].z=c;
top++; /* 压栈Move(a,c) */
sta[top].n=1;
sta[top].x=a;
sta[top].z=c;
top++; /* 压栈Hannoi(n1-1,a,c,b) */
sta[top].n=n1-1;
sta[top].x=a;
sta[top].y=c;
sta[top].z=b;
}
else
printf("move %c --> %c\n",a,c); /* 一个盘子时直接移动 */
}
}
int main()
{
Hanniota(3,'A','B','C'); /* 假设初始时3个盘子 */
return 0;
}
运行结果:
三、表达式求值算法
#include<stdio.h>
int menu() {
int c;
cout << "0-9以内的多项式计算" << endl;
cout << "1.计算" << endl;
cout << "0.退出\n" << endl;
cout << "选择:";
cin >> c;
return c;
}
int main() {
while (1) {
switch (menu()) {
case 1: {
cout << "请输入要计算的表达式(操作数和结果都在0-9的范围内,以#结束):" << endl;
char res = EvaluateExpression();//算法3.22 表达式求值
cout << "计算结果为" << res - 48 << endl << endl;
}
break;
case 0:
cout << "退出成功\n" << endl;
exit(0);
default:
break;
}
}
return 0;
}
运行结果:
以上就是本篇文章分享的全部内容,希望能帮助到大家~喜欢可以点赞收藏~