湘潭大学数据结构实验3实验报告源代码栈和队列剖析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

“数据结构和算法II”课程实验报告

实验名称:栈和队列的综合应用

班级姓名学号实验日期:

实验机时:2 学时实验成绩:

-------------------------------------------------------------------------------

一.实验目的:

1.熟悉栈的定义和基本操作

2.熟悉队列的定义和基本操作

3.掌握递归和非递归算法的实现技术和实际应用

4.加深对栈结构的理解,培养解决实际问题的编程能力。

二.实验内容:

(1)基本实验内容:

实现Hanoi 塔的问题;

完成迷宫问题或马踏棋盘问题求解。

三.程序及注释:

1.Hanoi塔问题:

typedef int ElementType;

#ifndef _Stack_h

#define _Stack_h

struct Node;

typedef struct Node *PtrToNode;

typedef PtrToNode Stack;

int IsEmpty( Stack S );

Stack CreateStack( void );

void DisposeStack( Stack S );

void MakeEmpty( Stack S );

void Push( ElementType X, Stack S );

ElementType Top( Stack S );

void Pop( Stack S );

#endif

#include

#include

#define Error( Str ) FatalError( Str )

#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 ) #include

struct Node//定义栈的结构

{ElementType Element;

PtrToNode Next;

char bianhao;};

int IsEmpty( Stack S )//判断栈是否为空

{return S->Next == NULL;}

Stack CreateStack()//创建一个空栈

{Stack S;

S = malloc( sizeof( struct Node ) );

if( S == NULL )

FatalError( "Out of space!!!" );

S->Next = NULL;

MakeEmpty( S );

return S;}

void MakeEmpty( Stack S )//将栈置空

{if( S == NULL )

Error( "Must use CreateStack first" );

else

while( !IsEmpty( S ) )

Pop( S );}

Void DisposeStack( Stack S )//销毁栈

{MakeEmpty( S );

free( S );}

void Push( ElementType X, Stack S )//向栈S中插入元素n

{PtrToNode TmpCell;

TmpCell = malloc( sizeof( struct Node ) );

if( TmpCell == NULL )

FatalError( "Out of space!!!" );

else

{TmpCell->Element = X;

TmpCell->Next = S->Next;

S->Next = TmpCell;}}

Void Pop( Stack S )//推出栈顶元素

{PtrToNode FirstCell;

if( IsEmpty( S ) )

Error( "Empty stack" );

else

{FirstCell = S->Next;

S->Next = S->Next->Next;

free( FirstCell );}}

void Move(Stack x,int n,Stack z)//将第编号为n的圆盘从x移动到z

{Pop(x);

Push(n,z);

printf("%2d:将原盘 %d 从 %c 移动到 %c\n",++c,n,x->bianhao,z->bianhao);} void hanoi(int n,Stack x,Stack y,Stack z)//汉诺塔问题解决函数

{if (n==1)

Move(x,1,z);

else

{hanoi(n-1,x,z,y);//将编号为1到n-1的圆盘从x利用z移动到y

Move(x,n,z);//将编号为n的圆盘从x移动到z

hanoi(n-1,y,x,z);}}// 将编号为1到n-1的圆盘从y利用x移动到z

int main()

{int n,i;

Stack x=CreateStack();

x->bianhao='x';//对栈x进行编号

Stack y=CreateStack();

y->bianhao='y';//对栈y进行编号

Stack z=CreateStack();

z->bianhao='z';//对栈z进行编号

printf("请输入Hanoi塔的高度\n");

scanf("%d",&n);

for(i=n;i>0;i--)

Push(i,x);

hanoi(n,x,y,z);

printf("移动完成!!!");

DisposeStack(x);//销毁栈x

DisposeStack(y);//销毁栈y

DisposeStack(z);//销毁栈z}

2.马踏棋盘

typedef int ElementType;

#ifndef _Stack_h

#define _Stack_h

struct Node;

typedef struct Node *PtrToNode;

typedef PtrToNode Stack;

int IsEmpty( Stack S );

Stack CreateStack( void );

void DisposeStack( Stack S );

void MakeEmpty( Stack S );

void Push( ElementType X, Stack S );

ElementType Top( Stack S );

void Pop( Stack S );

相关文档
最新文档