实验三
一、实验目的
1、掌握栈的储存结构的表示和实现方法。
2、掌握栈的入栈和出栈等基本操作算法实现。
3、了解栈在解决实际问题中的简单应用。
二、实验内容
1、建立顺序栈,并在顺序栈上实现入栈和出栈操作(验证性内容)。
2、建立链栈,并在链栈上实现入栈和出栈操作(设计性内容)。
3、实现汉诺塔求解问题(应用性设计内容)。
三、验证性实验
1、实验要求
编程实现如下功能:
(1) 根据输入的栈中元素个数n和各元素值建立一个顺序栈,并输出栈中各元素值。
(2) 将数据元素e入栈,并输出入栈后的顺序栈中各元素值。
(3) 将顺序栈中的占顶元素出栈,并输出出栈元素的值和出栈后顺序栈中各元素值。
四、设计性实验
编程实现链栈的入栈和出栈操作。
1、 实验要求
(1) 根据输入的占中元素个数和各元素值建立一个链栈,并输出链栈中各元素值,观察输入的内容与输出的内容是否一致,特别注意栈顶元素的位置。
(2) 将数据元素x入栈,并输出入栈后的链栈中各元素值。
(3) 将链栈中的栈顶元素出栈,并输出栈元素的值和出栈后链栈中各元素值。
五、应用性设计实验
编程实现汉诺塔求解问题
1、实验要求
假设有三个命名为X、Y和Z的塔座,在塔座X上插有n个直径大小个不相同且从小到大编号为1、2、……,n的圆盘。现要求将塔座X上的n个圆盘借助于塔座Y移至塔座Z上,并仍按同样顺序叠排。圆盘移动时必须遵循下列规则:
(1) 每次只能移动一个圆盘;
(2) 圆盘可以插在X、Y和Z中的任何一个塔座上;
附上编译成功代码:
验证性实验:
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define stack_init_size 100
#define stackincrement 10
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack &s)
{
s.base=(int*)malloc(stack_init_size*sizeof(int));
if(!s.base)
return ERROR;
s.top=s.base;
s.stacksize=stack_init_size;
return OK;
}
int Push(SqStack &s,int e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(int*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(int)); if(!s.base)
return ERROR;
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;
}
*s.top++=e;
return OK;
}
int Pop(SqStack &s,int &e)
{
if(s.top==s.base)
return ERROR;
e=*--s.top;
return OK;
}
void display(SqStack s)
{
for(s.top--;s.top!=s.base;s.top--)
printf("%d ",*s.top);
printf("%d\n",*s.top);
}
void main()
{
SqStack s;
int i=-1;
InitStack(s);
printf("end of 0:\n");
for(;;)
{
scanf("%d",&i);
if(i==0)
break;
Push(s,i);
}
printf("new stack:\n");
display(s);
getchar();
getchar();
Pop(s,i);
printf("%d\n",i);
display(s);
}
设计性试验:
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef struct SNode{
int data;
struct SNode *next;
}SNode,*LinkStack;
int Push(LinkStack &top,int e) {
LinkStack p;
p=(LinkStack)malloc(sizeof(SNode)); p->data=e;
p->next=top->next;
top->next=p;
return OK;
}
int Pop(LinkStack &top,int &e) {
LinkStack p;
p=top->next;
if(!p->next)
return ERROR;
e=p->data;
top->next=p->next;
free(p);
return OK;
}
void display(LinkStack top)
{
for(top=top->next;top->next;top=top->next) printf("%d ",top->data); printf("%d\n",top->data);
}
void main()
{
LinkStack top;
top=(LinkStack)malloc(sizeof(SNode)); top->next=NULL;
int i=-1,j;
printf("end of 0:\n");
for(;;)
{
scanf("%d",&i);
if(i==0)
break;
Push(top,i);
}
display(top);
Pop(top,j);
printf("%d\n",j);
display(top);
}
应用性设计实验:
#include<stdio.h>
void move(char x,int n,char z)
{
printf("%c->%c\n",x,z);
}
void hanoi(int n,char x,char y,char z) {
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
void main(void)
{ } int n=3; char x,y,z; x='a'; y='b'; z='c'; hanoi(n,x,y,z);
第二篇:数据结构C语言版顺序栈上机实验
实验 3-1 链栈
[目的] 掌握链栈的实现和简单的应用。
[源代码]
/**************************************************** @title: 数据结构实验
@name: <实验3-1> 栈的链式存储结构
@object:
[实验目的]
采用链式存储结构实现栈的基本操作
[实验提示]
1. 在stack.h中实现栈的基本操作,
在链式存储结构中可是省去头结点。
2. 在dsp0301.cpp中编写适当的代码,进行测试 @include:
stack.h [*]
栈的链式实现
@usage:
请查看"TO-DO列表",根据要求完成代码
@copyright: BTC 2004, Zhuang Bo
@author: Zhuang Bo
@date: 2004
@description:
*****************************************************/
#include <stdio.h>
#include <stdlib.h> //for system()
#include "stack.h" //链栈
//测试链栈的主程序
int main()
{
LinkStack s;
int x;
//输入若干正整数以0结束,依次入栈,然后依次出栈并打印 InitStack(s);
printf("输入若干正整数以0结束:");
scanf("%d",&x);
while(x!=0) {
Push(s,x);
scanf("%d",&x);
}
printf("\n出栈结果:");
while(!StackEmpty(s)) {
Pop(s,x);
printf("%4d",x);
}
//-------------------------------------
// TODO (#1#): 其它测试程序
//-------------------------------------
DestroyStack(s); //销毁栈
system("PAUSE");
return 0;
}
/*
Name: 栈的链式实现
Copyright:
Author:
Date:
Description:
*/
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include "ds.h" //for Status,OK ...
#ifndef ElemType
#define ElemType int /* 数据元素类型默认为 int */ #define ELEMTYPE_TAG
#endif
///////////////////////////////////////////////////////////
//链栈的存储结构定义
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
typedef LinkList LinkStack; //链栈类型
///////////////////////////////////////////////////////////
//链栈的基本操作声明
//构造一个空栈S
Status InitStack(LinkStack &S);
//销毁栈S
Status DestroyStack(LinkStack &S);
//将栈S清空
Status ClearStack(LinkStack &S);
//若栈S为空返回TRUE,否则FALSE Status StackEmpty(LinkStack S);
//返回栈S中的元素个数
int StackLength(LinkStack S);
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(LinkStack S, ElemType &e); //元素e入栈S
Status Push(LinkStack &S, ElemType e);
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(LinkStack &S, ElemType &e);
///////////////////////////////////////////////////////////
//链栈的基本操作的实现
//构造一个空栈S
Status InitStack(LinkStack &S)
{
// TODO (#1#): 构造一个空栈S,不带头结点 return ERROR;
//-------------------------------------
}
//销毁栈S
Status DestroyStack(LinkStack &S)
{
// TODO (#1#):销毁栈S,相当于清空栈 return ERROR;
//-------------------------------------
}
//将栈S清空
Status ClearStack(LinkStack &S)
{
// TODO (#1#): 将栈S清空,释放所有结点 return ERROR;
//-------------------------------------
}
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(LinkStack S)
{
// TODO (#1#): 若栈S为空返回TRUE,否则FALSE return TRUE;
//-------------------------------------
}
//返回栈S中的元素个数
int StackLength(LinkStack S)
{
// TODO (#1#): 返回栈S中的元素个数
return 0;
//-------------------------------------
}
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(LinkStack S, ElemType &e)
{
// TODO (#1#):若栈S不空,则用e返回栈顶元素 return ERROR;
//-------------------------------------
}
//元素e入栈S
Status Push(LinkStack &S, ElemType e)
{
// TODO (#1#): 插入元素e作为新的栈顶
return ERROR;
//-------------------------------------
}
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(LinkStack &S, ElemType &e)
{
// TODO (#1#):若栈S不空,则删除栈顶元素用e返回 return ERROR;
//-------------------------------------
}
#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif
#endif
实验 3-2 顺序栈
[目的] 掌握顺序栈的实现和简单的应用。
[源代码]
/**************************************************** @title: 数据结构实验
@name: <实验3-2> 栈的顺序存储结构
@object:
[实验目的]
采用顺序存储结构实现栈的基本操作
[实验提示]
1. 在stack.h中实现栈的基本操作
2. 在dsp0302.cpp中编写适当的代码,进行测试 @include:
stack.h [*]
栈的顺序实现
@usage:
请查看"TO-DO列表",根据要求完成代码
@copyright: BTC 2004, Zhuang Bo
@author: Zhuang Bo
@date: 2004
@description:
*****************************************************/
#include <stdio.h>
#include <stdlib.h> //for system()
#include "stack.h" //for SqStack
//测试顺序栈的主程序
int main()
{
SqStack s;
int x;
//输入若干正整数以0结束,依次入栈,然后依次出栈并打印 InitStack(s);
printf("输入若干正整数以0结束:");
scanf("%d",&x);
while(x!=0) {
Push(s,x);
scanf("%d",&x);
}
printf("\n出栈结果:");
while(!StackEmpty(s)) {
Pop(s,x);
printf("%4d",x);
}
//-------------------------------------
// TODO (#1#): 其它测试程序
//-------------------------------------
DestroyStack(s); //销毁栈
system("PAUSE");
return 0;
}
/*
Name: 顺序栈的实现
Copyright:
Author:
Date:
Description:
*/
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include "ds.h" //for Status,OK ...
#ifndef ElemType
#define ElemType int /* 数据元素类型默认为 int */
#define ELEMTYPE_TAG
#endif
#define SElemType ElemType
///////////////////////////////////////////////////////////
//顺序栈的存储结构定义
#define STACK_INIT_SIZE 100 /* 存储空间初始分配容量 */ #define STACKINCREMENT 10 /* 存储空间分配的增量 */ typedef struct {
ElemType *base; //在构造栈之前和销毁栈之后,base为NULL ElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间(元素个数)
} SqStack;
///////////////////////////////////////////////////////////
//顺序栈的基本操作声明
//构造一个空栈S
Status InitStack(SqStack &S);
//销毁栈S
Status DestroyStack(SqStack &S);
//将栈S清空
Status ClearStack(SqStack &S);
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(SqStack S);
//返回栈S中的元素个数
int StackLength(SqStack S);
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(SqStack S, ElemType &e);
//元素e入栈S
Status Push(SqStack &S, ElemType e);
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(SqStack &S, ElemType &e);
///////////////////////////////////////////////////////////
//顺序栈的基本操作的实现
//构造一个空栈S
Status InitStack(SqStack &S)
{
// TODO (#1#): 构造一个空栈S
return ERROR;
//-------------------------------------
}
//销毁栈S
Status DestroyStack(SqStack &S)
{
// TODO (#1#):销毁栈S,相当于清空栈
return ERROR;
//-------------------------------------
}
//将栈S清空
Status ClearStack(SqStack &S)
{
// TODO (#1#): 将栈S清空,释放所有结点 return ERROR;
//-------------------------------------
}
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(SqStack S)
{
// TODO (#1#): 若栈S为空返回TRUE,否则FALSE return TRUE;
//-------------------------------------
}
//返回栈S中的元素个数
int StackLength(SqStack S)
{
// TODO (#1#): 返回栈S中的元素个数
return 0;
//-------------------------------------
}
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(SqStack S, ElemType &e)
{
// TODO (#1#):若栈S不空,则用e返回栈顶元素 return ERROR;
//-------------------------------------
}
//元素e入栈S
Status Push(SqStack &S, ElemType e)
{
// TODO (#1#): 插入元素e作为新的栈顶
return ERROR;
//-------------------------------------
}
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(SqStack &S, ElemType &e)
{
// TODO (#1#):若栈S不空,则删除栈顶元素用e返回 return ERROR;
//-------------------------------------
}
#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif
#endif
/**************************************************** @title: 数据结构实验
@name: <实验3-2> 顺序栈和栈的应用
@object:
[实验目的]
实现顺序栈;实现几个栈的具体应用
[实验提示]
1. 在stack.h中实现顺序栈
2. 在app0302.cpp中编写栈的应用程序, 数制转换,括号匹配的检验
@include:
stack.h [*]
顺序栈模块
@usage:
请查看"TO-DO列表",根据要求完成代码
@copyright: BTC 2004, Zhuang Bo
@author: Zhuang Bo
@date: 2004
@description:
*****************************************************/
#include <stdio.h>
#include <stdlib.h> //for system()
#include "stack.h" //for SqStack
//数制转换程序
void Conversion();
//检验括号匹配
void Match();
int main()
{
//数制转换程序
Conversion();
//检验括号匹配
Match();
system("PAUSE");
return 0;
}
//数制转换程序
void Conversion()
{
//-------------------------------------
// TODO (#1#): 这里实现数制转换程序
//-------------------------------------
}
//检验括号匹配
void Match()
{
//-------------------------------------
// TODO (#1#): 这里实现检验括号匹配的程序
//-------------------------------------
}
/*
Name: 顺序栈的实现
Copyright:
Author:
Date:
Description:
*/
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include "ds.h" //for Status,OK ...
#ifndef ElemType
#define ElemType int /* 数据元素类型默认为 int */
#define ELEMTYPE_TAG
#endif
#define SElemType ElemType
///////////////////////////////////////////////////////////
//顺序栈的存储结构定义
#define STACK_INIT_SIZE 100 /* 存储空间初始分配容量 */ #define STACKINCREMENT 10 /* 存储空间分配的增量 */ typedef struct {
ElemType *base; //在构造栈之前和销毁栈之后,base为NULL ElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间(元素个数)
} SqStack;
///////////////////////////////////////////////////////////
//顺序栈的基本操作声明
//构造一个空栈S
Status InitStack(SqStack &S);
//销毁栈S
Status DestroyStack(SqStack &S);
//将栈S清空
Status ClearStack(SqStack &S);
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(SqStack S);
//返回栈S中的元素个数
int StackLength(SqStack S);
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(SqStack S, ElemType &e);
//元素e入栈S
Status Push(SqStack &S, ElemType e);
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(SqStack &S, ElemType &e);
///////////////////////////////////////////////////////////
//顺序栈的基本操作的实现
//构造一个空栈S
Status InitStack(SqStack &S)
{
// TODO (#1#): 构造一个空栈S
return ERROR;
//-------------------------------------
}
//销毁栈S
Status DestroyStack(SqStack &S)
{
// TODO (#1#):销毁栈S,相当于清空栈
return ERROR;
//-------------------------------------
}
//将栈S清空
Status ClearStack(SqStack &S)
{
// TODO (#1#): 将栈S清空,释放所有结点 return ERROR;
//-------------------------------------
}
//若栈S为空返回TRUE,否则FALSE
Status StackEmpty(SqStack S)
{
// TODO (#1#): 若栈S为空返回TRUE,否则FALSE return TRUE;
//-------------------------------------
}
//返回栈S中的元素个数
int StackLength(SqStack S)
{
// TODO (#1#): 返回栈S中的元素个数
return 0;
//-------------------------------------
}
//用e返回栈顶元素
// 前提:栈S存在且不空
Status GetTop(SqStack S, ElemType &e)
{
// TODO (#1#):若栈S不空,则用e返回栈顶元素 return ERROR;
//-------------------------------------
}
//元素e入栈S
Status Push(SqStack &S, ElemType e)
{
// TODO (#1#): 插入元素e作为新的栈顶
return ERROR;
//-------------------------------------
}
//S出栈用e返回出栈元素
// 前提:栈S存在且不空
Status Pop(SqStack &S, ElemType &e)
{
// TODO (#1#):若栈S不空,则删除栈顶元素用e返回 return ERROR;
//-------------------------------------
}
#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif
#endif