}
//task2
#include
#include
usingnamespacestd;
constintmaxstack=10;//smallvaluefortesting
typedefintError_code;
#defineunderflow2
#defineoverflow3
#definesuccess0
typedefintStack_entry;
classStack{
public:
Stack();
boolempty()const;
Error_codepop();
Error_codetop(Stack_entry&item)const;
Error_codepush(constStack_entry&item);
private:
intcount;
Stack_entryentry[maxstack];
};
Error_codeStack:
:
push(constStack_entry&item)
/*
Pre:
None.
Post:
IftheStackisnotfull,itemisaddedtothetop
oftheStack.IftheStackisfull,
anError_codeofoverflowisreturnedandtheStackisleftunchanged.
*/
{
Error_codeoutcome=success;
if(count>=maxstack)
outcome=overflow;
else
entry[count++]=item;
returnoutcome;
}
Error_codeStack:
:
pop()
/*
Pre:
None.
Post:
IftheStackisnotempty,thetopof
theStackisremoved.IftheStack
isempty,anError_codeofunderflowisreturned.
*/
{
Error_codeoutcome=success;
if(count==0)
outcome=underflow;
else--count;
returnoutcome;
}
Error_codeStack:
:
top(Stack_entry&item)const
/*
Pre:
None.
Post:
IftheStackisnotempty,thetopof
theStackisreturnedinitem.IftheStack
isemptyanError_codeofunderflowisreturned.
*/
{
Error_codeoutcome=success;
if(count==0)
outcome=underflow;
else
item=entry[count-1];
returnoutcome;
}
boolStack:
:
empty()const
/*
Pre:
None.
Post:
IftheStackisempty,trueisreturned.
Otherwisefalseisreturned.
*/
{
booloutcome=true;
if(count>0)outcome=false;
returnoutcome;
}
Stack:
:
Stack()
/*
Pre:
None.
Post:
Thestackisinitializedtobeempty.
*/
{
count=0;
}
intmain()
{
return0;
}
//题目四的代码略
实验二多项式加减法
一、实验目的
通过实现多项式的加法,对链表有更深入的了解
二、实验内容
问题描述:
设计一个一元稀疏多项式简单的加减法计算器
实现要求:
一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式:
;
(2)输出多项式
(3)多项式A和B相加,建立多项式C=A+B,并输出相加的结果多项式C
(4)选作:
多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D
//实验代码
//polynomial.h文件
#ifndef__POLYNOMIAL__
#define__POLYNOMIAL__
structNode;//单链表节点类型
typedefstructNode*PNode;//节点指针类型
structNode//单链表节点结构
{
intcoef;//系数
intexp;//指数
PNodenext;//指针域
};
typedefstructNode*Linklist;//单链表类型
//单链表操作函数声明
//创建头结点
LinklistCreateNullList_link(void);
Linklistinput(Linklistllist);
intprint(Linklistllist);
//voidDisplay(Linklistllist);
#endif
//polynomial.c文件
#include
#include
#include"polynomial.h"
//创建头结点
LinklistCreateNullList_link(void)
{
Linklisthead;
head=(Linklist)malloc(sizeof(structNode));//申请表头节点内存
if(head!
=NULL)
{
head->next=NULL;
}
else
{
printf("创建失败!
");
}
returnhead;
}
Linklistinput(Linklistllist)
{
PNodep,c;
intcoef;//系数
intexp;//指数
c=llist;
printf("请输入链表中的数据,输入0结束:
\n");
scanf("%d",&coef);
scanf("%d",&exp);
while(coef!
=0)
{
p=(PNode)malloc(sizeof(structNode));
c->next=p;
p->coef=coef;
p->exp=exp;
p->next=NULL;
c=c->next;
scanf("%d",&coef);
scanf("%d",&exp);
}
returnllist;
}
intprint(Linklistllist)
{
PNodep;
printf("新创建的链表如下:
\n");
p=llist->next;
if(p==NULL)
{
printf("空链表啦!
");
return0;
}
while(p!
=NULL)
{
//p=p->link;
printf("%d\n",p->coef);
printf("%d\n",p->exp);
p=p->next;
}
return1;
}
voidDisplay(Linklistllist)
{
PNodep;
p=llist->next;
while(p!
=NULL)
{
printf("%d*(x)^%d+",p->coef,p->exp);
p=p->next;
}
}
//MainTest.c文件
#include
#include
#include"polynomial.h"
intmain()
{
Linklisthead1,head2;
printf("创建第一个多项式\n");
head1=CreateNullList_link();
input(head1);
print(head1);
Display(head1);
printf("创建第二个多项式\n");
head2=CreateNullList_link();
input(head2);
print(head2);
Display(head2);
return0;
}
实验三走迷宫
一、实验目的
通过设计走迷宫的算法,了解递归程序设计,使用非递归和递归方法分别完成走迷宫的算法
二、实验内容
本次实验的题目详细见实验题目文档,要求为走迷宫设计两种算法,一种使用了递归,一种没有使用递归的算法。
实验题目中详细讲述的算法是非递归算法,用栈为辅助的数据结构。
这里可以使用标准模板库中的stack
三实验代码
#include
#include
usingnamespacestd;
charmaze_layout[12][12]={
{'1','1','1','1','1','1','1','1','1','1','1','1'},
{'1','0','1','0','1','1','1','0','0','0','0','1'},
{'1','0','1','0','0','1','0','0','0','0','0','1'},
{'1','0','0','0','0','1','0','1','1','0','0','1'},
{'1','1','1','1','0','1','0','1','0','0','0','1'},
{'1','0','0','1','0','0','0','1','0','1','1','1'},
{'1','0','0','1','0','0','0','1','0','1','1','1'},
{'1','0','1','1','0','1','0','1','0','0','0','1'},
{'1','0','0','0','0','1','0','1','1','0','0','1'},
{'1','0','0','0','0','1','0','1','1','0','0','1'},
{'1','0','0','0','0','1','0','1','1','0','0','1'},//->Exit
{'1','1','1','1','1','1','1','1','1','1','1','1'}
};
typedefstructPoint
{
intx;
inty;
}Point,*PPoint;
PointdirectPoint[]={{1,0},{0,1},{-1,0},{0,-1},{1,-1},{1,1},{-1,-1},{-1,1}};
//下,右,上,左,左下,右下,左上,右上
voiddisplayMaze()
{
cout<<"Enter->\t";
for(introw=1;row<11;row++)
{
for(intcol=1;col<11;col++)
{
if(maze_layout[row][col]=='+')//把'+'消去
{
maze_layout[row][col]='0';
}
cout<}
if(row!
=10)
{
cout<}
}
cout<<"-->EXIT"<}
boolsolve(inti,intj)//递归
{
boolfinish=false;
maze_layout[i][j]='X';
if(i==10&&j==10)
returntrue;//becausewe'redone
introw,col;
for(intk=0;k<8;k++)//八个方向都走一遍
{
row=i+directPoint[k].x;
col=j+directPoint[k].y;
if(!
finish&&maze_layout[row][col]=='0')
{
finish=solve(row,col);
}
}
if(!
finish)//无法走通,那么修改原来设置的X符号,但是不设置为0,因为这个点现在已经走过
{
maze_layout[i][j]='+';
}
returnfinish;
}
boolIsCanMove(Pointpoint1,Point&point2)
//point1是否可以移动,能移动就把移动后的位置赋给point2
{
introw,col;
maze_layout[point1.x][point1.y]='+';
if(point1.x==10&&point1.y==10)//走到终点不可以再走了
{
returnfalse;
}
for(inti=0;i<8;i++)
{
row=point1.x+directPoint[i].x;
col=point1.y+directPoint[i].y;
if(maze_layout[row][col]=='0')
{
point2.x=row;
point2.y=col;
returntrue;
}
}
returnfalse;
}
boolMaze()//非递归
{
stacks;
Pointpoint1,point2;
point1.x=1;
point1.y=1;
while(IsCanMove(point1,point2))
{
while(IsCanMove(point1,point2))
{
s.push(point1);
point1=point2;
}
if(point1.x==10&&point1.y==10)
{
s.push(point1);
break;
}
while(!
s.empty()&&!
IsCanMove(point1,point2))
{
point1=s.top();
s.pop();
}
}
if(s.empty())
{
returnfalse;
}
while(!
s.empty())
{
maze_layout[s.top().x][s.top().y]='X';
s.pop();
}
returntrue;
}
intmain()
{
solve(1,1);
//Maze();
displayMaze();
return0;
}
实验四按层次构造二叉树及二叉树遍历
一、实验目的
设计数据结构和算法,实现树的构建
掌握树的前根序、中根序和后根序遍历算法
了解c++中类模板的定义和使用
二、实验内容
这个实验中要求用类模板来实现树的类。
需要对类模板有些了解。
注意,在编写代码的时候,要将所有模板信息放在一个头文件中,并在要使用这些模板的文件中包含该头文件(如果分别用.h和.cpp实现,那就必须在使用该类的地方同时包含该.h和.cpp文件)。
因为模板不是函数,模板必须与特定的模板实例化请求一起使用。
若将模板成员函数放置在一个独立的实现文件中将无法运行。
1.二叉树的构建和遍历
详细见实验题目文档。
教科书上有一个用类模板实现的二叉树的类的定义,需要补充实现其中的二叉树的构建(要求使用实验题目文档中的方法,但是实验题目文档中没有描述具体的算法,这里等下会简单讲述具体的算法)。
在正确构建二叉树,实现这个类的基础上,对构建好的二叉树进行遍历(前根序、中根序和后根序,这三个遍历算法在教科书上都有详细的代码)。
2.二叉树结点的插入
详细见实验题目文档。
简单的说就是根据二叉树的高度,进行结点的插入,把结点插入到高度最小的二叉树分叉上。
这也是教科书中的一个习题。
其中需要计算二叉树左右分支的高度。
(1)计算树的高度的关键代码如下,采用的是递归调用:
计算树的高度函数
{
如果寻找到的结点为空(空子树),则返回树的高度为0
否则进行下面的步骤
1.计算左子树的高度
2.计算右子树的高度
3.返回左右子树中高度最大的+1。
}
(2)插入结点的算法如下,采用的是递归调用
插入结点函数
{
如果找到的结点为空(空子树),则插入结点
否则进行下面的步骤
{
如果右子树的高度小于左子树的高度,则往右子树插入结点
如果右子树的高度大于等于左子树的高度,则往左子树插入结点
}
}
注意事项:
1、辅助构造树的队列中放的要是指向树结点的指针
2、对于c++不熟悉的同学,如果使用模板类,会有很大难度,建议大家如果对于c++不熟悉,则不用模板类,用普通的类实现也是允许的
三实验代码
#include
#include
usingnamespacestd;
structBinary_node//结构体
{
chardata;
Binary_node*left;
Binary_node*right;
};
classBintree
{
private:
Binary_node*root;
public:
Bintree()
{
root=NULL;
}
voidbuildtree();//用户输入数据“#”结束
Bintreeleftchild(Bintree);//查找并返回左子树
Bintreerightchild(Bintree);//查找并返回右子树
voidpreorder(Bintree);//先根遍历并输出
voidinorder(Bintree);//中根
voidpostorder(Bintree);//后根
};
BintreeBintree:
:
leftchild(Bintreet)
{
Bintreetmp;//返回左子树
tmp.root=t.root->left;
returntmp;
}
BintreeBintree:
:
rightchild(Bintreet)
{
Bintreetmp;
tmp.root=t.root->right;////返回右子树
returntmp;
}
voidBintree:
:
preorder(Bintreet)//先根
{
if(t.root==NULL)return;
cout<data;
preorder(leftchild(t));
preorder(rightchild(t));
}
voidBintree:
:
inorder(Bintreet)//中根
{
if(t.root==NULL)return;
inorder(leftchild(t));
cout<data;
inorder(rightchild(t));
}
voidBintree:
:
postorder(B