当前位置:文档之家› 数据结构栈的定义及基本操作介绍

数据结构栈的定义及基本操作介绍

数据结构栈的定义及基本操作介绍
数据结构栈的定义及基本操作介绍

北京理工大学珠海学院实验报告

ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 班级软件工程3班学号 150202102309姓名郭荣栋

指导教师余俊杰成绩

实验题目栈的实现与应用实验时间

一、实验目的、意义

(1)理解栈的特点,掌握栈的定义和基本操作。

(2)掌握进栈、出栈、清空栈运算的实现方法。

(3)熟练掌握顺序栈的操作及应用。

二、实验内容及要求

1.定义顺序栈,完成栈的基本操作:建空栈、入栈、出栈、取栈顶元素(参见教材45页)。

2. 调用栈的基本操作,将输入的十进制数转换成十六进制数。

3. 调用栈的基本操作,实现表达式求值,如输入3*(7-2)#,得到结果15。

三、实验结果及分析

(所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)

四、程序清单(包含注释)

1、2.

#include

#include

#include

using namespace std;

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define MAXSIZE 100

#define INCREASEMENT 10

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef int SElemType;

typedef int Status;

typedef struct{

SElemType *base;

SElemType *top;

int stacksize;

}Sqstack;

void StackTraverse(Sqstack S)

{

while (S.top != S.base)

{

cout << *(S.top-1) << endl;

S.top--;

}

}

Status InitStack(Sqstack &S){

S.base=(SElemType

*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!S.base){

exit(OVERFLOW);

}

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

return OK;

}

Status GetTop(Sqstack &S, SElemType &e)

{

if (S.top == S.base)

return ERROR;

e = *(S.top - 1);

cout<

cout << "The stack is:" << endl;

StackTraverse(S);

return OK;

}

Status push(Sqstack &S,SElemType e){

if(S.top-S.base>=S.stacksize)

{

S.base=(SElemType*)realloc(S.base,(INCREASEMENT+S.stac ksize)*sizeof(SElemType));

if(!S.base)

exit(OVERFLOW);

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

return OK;

}

Status Pop(Sqstack &S, SElemType &e) {

if (S.base == S.top)

return ERROR;

e = *--S.top;

return OK;

}

Status StackEmpty(Sqstack S)

{

return (S.top == S.base);

}

void main()

{

Sqstack S;

int a,b,e;

InitStack(S);

printf("请键入栈的十进制数值:");

cin>>a;

while(a)

{

push(S,a%16);

a=a/16;

}

printf("此时栈顶元素为:");

GetTop(S,e);

printf("转换为十六进制数为:");

while(!StackEmpty(S))

{

Pop(S,b);

printf("%x",b);

}

printf("\n");

system("pause");

}

3.

#include

#include

#include

#include

using namespace std;

#define OK 1

#define ERROR 0

#define OVERFLOW 0

#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

typedef int SElemType; typedef int Status;

typedef float OperandType;

typedef struct{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

void StackTraverse(SqStack S) {

while (S.top != S.base)

{

cout << *(S.top-1) << endl;

S.top--;

}

Status InitStack(SqStack &S){

S.base=(SElemType

*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!S.base){

exit(OVERFLOW);

}

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

return OK;

}

Status StackEmpty(SqStack S)

{

if(S.top==S.base)

return OK;

return ERROR;

}

Status GetTop(SqStack S, SElemType &e)

{

if (StackEmpty(S))

return ERROR;

e = *(S.top - 1);

return OK;

Status push(SqStack &S,SElemType e){

if(S.top-S.base>=S.stacksize)

{

S.base=(SElemType*)realloc(S.base,(STACKINCRE MENT+S.stacksize)*sizeof(SElemType));

if(!S.base)

return OVERFLOW;

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

return OK;

}

Status Pop(SqStack &S, SElemType &e)

{

if (S.base == S.top)

return ERROR;

e = *--S.top;

return OK;

}

char a[7][7]={'>','>','<','<','<','>','>',

'>','>','<','<','<','>','>',

'>','>','>','>','<','>','>',

'>','>','>','>','<','>','>',

'<','<','<','<','<','=','\0',

'>','>','>','>','\0','>','>',

'<','<','<','<','<','\0','='}; int In(char);

char Precede(char x,char y)

{

int i,j;

i=In(x);

j=In(y);

return a[i][j];

}

Status operate(int a,char theta,int b) {

switch(theta)

{

case'+':

return a+b;

case'-':

return a-b;

case'*':

return a*b;

case'/':

return a/b;

}

}

Status In(char theta) {

int n;

switch(theta)

{

case'+':

n=0;

break;

case'-':

n=1;

break;

case'*':

n=2;

break;

case'/':

n=3;

break;

case'(':

n=4;

break;

case')':

n=5;

break;

case'#':

n=6;

break;

}

return n;

}

OperandType EvaluateExpression()

{

char c,d[100];

int i,e,a,b,theta,num;

SqStack Optr,Opnd;

InitStack(Optr);

push(Optr,'#');

InitStack(Opnd);

printf("请输入一串表达式并以'#'结尾:");

c=getchar();

GetTop(Optr,e);

while(c!='#'||e!='#')

{

if((c>='0'&&c<='9')||c=='.')

{

i=0;

do{

d[i++]=c;

c=getchar();

}while(c>='0'&&c<='9');

d[i]='\0';

num=atoi(d);

push(Opnd,num);

}

else{

GetTop(Optr,e);

switch(Precede(e,c)){

case'<':

push(Optr,c);

c=getchar();

break;

case'=':

Pop(Optr,e);

c=getchar();

break;

case'>':

Pop(Optr,theta);

Pop(Opnd,b);

Pop(Opnd,a);

push(Opnd,operate(a,theta,b));

break;

};

}

GetTop(Optr,e);

}

GetTop(Opnd,e);

return e;

}

int main()

{

printf("表达式结果

为:%0.2f\n",EvaluateExpression());

system("pause");

return 0;

}

数据结构实验二_栈的基本操作

青岛理工大学课程实验报告

s->top=s->base; s->stacksize=stack_init_size; return 1; } 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 0; s->top=s->base+s->stacksize; s->stacksize+=stackincrement; } *(s->top++)=e; return e; } int Pop(sqstack *s,int e) { if(s->top==s->base) return 0; e=*--s->top; return e; } int stackempty(sqstack *s) { if(s->top==s->base) { return 1; } else Push(s,n%flag); n=n/flag; } while(!stackempty(s)) { e=Pop(s,e); switch(e) { case 10: printf("A"); break; case 11: printf("B"); break; case 12: printf("C"); break; case 13: printf("D"); break; case 14: printf("E"); break; case 15: printf("F"); break; default: printf("%d",e); } } printf("\n"); return 0; } int main() { sqstack s; StackInit(&s); conversion(&s); return 0; }

数据结构 图的基本操作实现

实验五图的遍历及其应用实现 一、实验目的 1.熟悉图常用的存储结构。 2.掌握在图的邻接矩阵和邻接表两种结构上实现图的两种遍历方法实现。 3.会用图的遍历解决简单的实际问题。 二、实验内容 [题目一] :从键盘上输入图的顶点和边的信息,建立图的邻接表存储结构,然后以深度优先搜索和广度优先搜索遍历该图,并输出起对应的遍历序列. 试设计程序实现上述图的类型定义和基本操作,完成上述功能。该程序包括图类型以及每一种操作的具体的函数定义和主函数。 提示: 输入示例 上图的顶点和边的信息输入数据为: 5 7 DG A B C D E AB AE BC CD DA DB EC [题目二]:在图G中求一条从顶点 i 到顶点 s 的简单路径 [题目三]:寻求最佳旅游线路(ACM训练题) 在一个旅游交通网中,判断图中从某个城市A到B是否存在旅游费用在s1-s2元的旅游线路,为节省费用,不重游故地。若存在这样的旅游线路则并指出该旅游线路及其费用。 输入: 第一行:n //n-旅游城市个数 第2行:A B s1 s2 //s1,s2-金额数 第3行---第e+2行 ( 1≤e≤n(n-1)/2 ) 表示城市x,y之间的旅行费用,输入0 0 0 表示结束。

输出: 第一行表示 A到B的旅游线路景点序列 第二行表示沿此线路,从A到B的旅游费用 设计要求: 1、上机前,认真学习教材,熟练掌握图的构造和遍历算法,图的存储结 构也可使用邻接矩阵等其他结构. 2、上机前,认真独立地写出本次程序清单,流程图。图的构造和遍历算法 分别参阅讲义和参考教材事例 图的存储结构定义参考教材 相关函数声明: 1、/* 输入图的顶点和边的信息,建立图*/ void CreateGraph(MGraph &G) 2、/* 深度优先搜索遍历图*/ void DFSTraverse(Graph G, int v) 3、/*广度优先搜索遍历图 */ void BFSTraverse(Graph G, int v)4、 4、/* 其他相关函数 */…… 三、实验步骤 ㈠、数据结构与核心算法的设计描述 ㈡、函数调用及主函数设计 (可用函数的调用关系图说明) ㈢程序调试及运行结果分析 ㈣实验总结 四、主要算法流程图及程序清单 1、主要算法流程图: 2、程序清单 (程序过长,可附主要部分)

数据结构中栈的介绍

数据结构中栈的介绍 1.栈的概念 栈(Stack)是一种特殊的表,这种表只在表的一端进行插入和删除操作。允许插入和删除数据元素的这一端称为栈顶;而另一固定的一端称为栈底。不含任何元素的栈称为空栈。 栈的修改是按后进先出的原则进行的。栈又称为后进先出(Last In First Out)表,简称为LIFO表。 如图1所示:假设一个栈S中的元素为a n,a n-1,..,a1,则称a1为栈底元素,a n为栈顶元素。 图1 图 2 2.栈的存储与操作 由于栈是一个特殊的表,可以用一维数组来实现栈。同时设立指针t(称为栈顶指针)来指示栈顶元素的当前位置。 我们用一个数组s[1..m]来表示一个栈时,将栈底固定在数组的底部,即s[1]为最早入栈的元素,并让栈向数组上方(下标增大的方向)扩展。当t=0时,表示这个栈为一个空栈。当t=m时,表示这个栈已满。 可以用下列方式定义栈: const m=栈表目数的上限; type stack=array[1..m] of stype; {栈的数据类型} var s:stack; t:integer; {栈顶指针} 进栈、出栈操作的过程和函数(假设栈元素的数据类型为整型): (1)进栈过程(push) ①若t≥m时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②); ②置t=t+1(栈指针加1,指向进栈地址); ③S(t)=x,结束(x为新进栈的元素); procedure push(var s:stack; x:integer;var t:integer); begin if t=m then writeln('overflow') else begin

顺序栈的基本操作讲解

遼穿紳範大學上机实验报告 学院:计算机与信息技术学院 专 业 : 计算机科学与技术(师 范) 课程名称:数据结构 实验题目:顺序栈的基本操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号 一、实验目的: 1 ?熟悉掌握栈的定义、结构及性质; 2. 能够实现创建一个顺序栈,熟练实现入栈、出栈等栈的基本操作; 3?了解和掌握栈的应用。 二、实验环境: Microsoft Visual C++ 6.0

三、实验内容及要求: 栈是一种特殊的线性表,逻辑结构和线性表相同,只是其运算规则有更多的限制,故又称为受限的线性表。 建立顺序栈,实现如下功能: 1. 建立一个顺序栈 2. 输出栈 3. 进栈 4. 退栈 5. 取栈顶元素 6. 清空栈 7. 判断栈是否为空 进行栈的基本操作时要注意栈”后进先出”的特性。 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序栈。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作

五、代码: #include #include #define maxsize 64 typedef int datatype; //定义结构体typedef struct { datatype data[maxsize]; int top; }seqstack; //建立顺序栈seqstack *SET(seqstack *s) { int i; s=(seqstack*)malloc(sizeof(seqstack)); s->top=-1; printf(" 请输入顺序栈元素(整型,以scanf("%d",&i); do{ s->top++; s->data[s->top]=i; scanf("%d",&i); 0 结束):"); }while(i!=0); printf(" 顺序栈建立成功\n"); return s; } //清空栈void SETNULL(seqstack *s) { s->top=-1;} //判断栈空 int EMPTY(seqstack *s) { if(s->top>=0) return 0; else return 1;} //进栈 seqstack *PUSH(seqstack *s) { int x; printf(" 你想要插入的数字:"); scanf("%d",&x); if(s->top==maxsize-1) { printf("overflow"); return NULL; } else {

数据结构_实验三_栈和队列及其应用

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈与队列及其应用_ 一.实验目得及要求 (1)掌握栈与队列这两种特殊得线性表,熟悉它们得特性,在实际问题背景下灵活运用它们; (2)本实验训练得要点就是“栈”得观点及其典型用法; (3)掌握问题求解得状态表示及其递归算法,以及由递归程序到非递归程序得转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); (2)应用栈得基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中得基本操作(队列得初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中得语法检查(括号得匹配)。 (5)利用栈实现表达式得求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); A、顺序储存: ?代码部分: //Main、cpp: #include"SStack、h" int main() { SqStack S; SElemType e;

int elect=1; InitStack(S); cout << "已经创建一个存放字符型得栈" << endl; while (elect) { Muse(); cin >> elect; cout << endl; switch (elect) { case 1: cout << "input data:"; cin >> e; Push(S, e); break; case 2: if(Pop(S, e)) {cout << e <<" is pop"<< endl; } else{cout<<"blank"<

数据结构栈的定义及基本操作介绍

北京理工大学珠海学院实验报告 ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 班级软件工程3班学号 150202102309姓名郭荣栋 指导教师余俊杰成绩 实验题目栈的实现与应用实验时间 一、实验目的、意义 (1)理解栈的特点,掌握栈的定义和基本操作。 (2)掌握进栈、出栈、清空栈运算的实现方法。 (3)熟练掌握顺序栈的操作及应用。 二、实验内容及要求 1.定义顺序栈,完成栈的基本操作:建空栈、入栈、出栈、取栈顶元素(参见教材45页)。 2. 调用栈的基本操作,将输入的十进制数转换成十六进制数。 3. 调用栈的基本操作,实现表达式求值,如输入3*(7-2)#,得到结果15。 三、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)

四、程序清单(包含注释) 1、2. #include #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 #define INCREASEMENT 10 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

typedef int SElemType; typedef int Status; typedef struct{ SElemType *base; SElemType *top; int stacksize; }Sqstack; void StackTraverse(Sqstack S) { while (S.top != S.base) { cout << *(S.top-1) << endl; S.top--; } } Status InitStack(Sqstack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base){ exit(OVERFLOW); }

数据结构栈的应用(迷宫求解)

栈的应用 迷宫求解 任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出; 源代码: #include #include /*数据定义*/ typedefenum { ERROR, OK } Status; typedefstruct { int row; //row表示"行"号 int line; //line表示"列"号 }PosType; //位置的元素类型 typedefstruct { intord; //该通道在路径上的"序号" PosType seat; //通道块在迷宫中的"坐标位置" int di; //从此通道走向下以通道块的"方向" }SElemType; //栈的元素类型 typedefstruct { SElemType * base; SElemType * top; intstacksize; }SqStack; /*函数原型说明*/ Status InitStack(SqStack&S); //创建一个空栈S Status Push(SqStack&S,SElemType&a); //插入新元素a Status Pop(SqStack&S,SElemType&a); //删除栈顶元素,a返回其值 Status StackEmpty(SqStack S); //检查是否空栈 Status MazePath(int maze[12][12],SqStack&S, PosType start, PosType end); //找通路 void Initmaze(int maze[12][12],intx,int y); //初始化迷宫 void printmaze(int maze[12][12],intx,int y); //显示迷宫 Status Pass(int maze[12][12],PosTypeCurPos); //判断当前位置是否可通 void Markfoot(int maze[12][12], PosTypeCurPos); //标记当前位置不可通 PosTypeNextPos(PosTy peCurPos, intDir); //进入下一位置 void printpath(int maze[12][12],SqStackS,intx,inty,PosTypestart,PosType end); //显示通路 /*主函数*/ void main (void) { PosTypestart,end; int t=0; SqStack S;

数据结构栈的基本操作,进栈,出栈

第五次实验报告—— 顺序栈、链栈的插入和删除一需求分析 1、在演示程序中,出现的元素以数字出现定义为int型, 2、演示程序在计算机终端上,用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在终端上 3、顺序栈的程序执行的命令包括如下: (1)定义结构体 (2)顺序栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)顺序栈的打印结果 3、链栈的程序执行的命令包括如下: (1)定义结构体 (2)链栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)链栈的打印结果 二概要设计 1、顺序栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: InitStack(SqStack &S) 操作结果:构造一个空栈 Push(L,e) 操作结果:插入元素e为新的栈顶元素

Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 2、链栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: LinkStack(SqStack &S) 操作结果:构造一个空栈 Status Push(L,e) 操作结果:插入元素e为新的栈顶元素 Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 3、顺序栈程序包含的主要模块: (1) 已给定的函数库: (2)顺序栈结构体: (3)顺序栈初始化及创建: (4)元素插入 (5)元素删除

数据结构--图的应用及其实现

实验六图的应用及其实现 (相关知识点:拓扑排序、关键路径、最小生成树和最短路径) 一、实验目的 1.进一步功固图常用的存储结构。 2.熟练掌握在图的邻接表实现图的基本操作。 3.理解掌握AOV网、AOE网在邻接表上的实现以及解决简单的应用问题。 二、实验内容 一>.基础题目:(本类题目属于验证性的,要求学生独立完成) [题目一]:从键盘上输入AOV网的顶点和有向边的信息,建立其邻接表存储结构,然后对该图拓扑排序,并输出拓扑序列. 试设计程序实现上述AOV网的类型定义和基本操作,完成上述功能。 测试数据:教材图7.28 [题目二]:从键盘上输入AOE网的顶点和有向边的信息,建立其邻接表存储结构,输出其关键路径和关键路径长度。试设计程序实现上述AOE网类型定义和基本操作,完成上述功能。 测试数据:教材图7.29 二>.简单应用题目:(ACM/ICPC训练题,本类题目属于设计性的,要求学生三人为一个团队,分工协作完成)) 【题目三】高速公路 描述 某国共有n个城市(n不超过200),有些城市之间直接有一条高速公路相连,高速公路都是双向的,总共有m条。每条高速公路都有自己的载重限制,即载重最大值。通过车辆的载重不能超过公路的载重限制。如今我们想了解的是,从某一起点城市出发,到达目标城市,车辆最多能带多重的货物。 输入 输入的第一行为两个整数n和m。以下有m行,每行三个整数描述一条公路,分别是首尾相连的城市以及载重限制。然后是一个整数k,即问题个数。接下来k行描述k个问题,每行两个整数表示起点城市和目标城市。问题数不超过一百。 输出

输出包括k行,每行对应一个问题,输出从起点到目标的最大载重量。如果两城市间无路径则输出-1。 样例输入 3 3 1 2 100 2 3 100 1 3 50 2 1 3 2 3 样例输出 100 100 【题目四】最短的旅程 描述 在Byteland有n个城市(编号从1到n),它们之间通过双向的道路相连。Byteland 的国王并不大方,所以,那里只有n -1条道路,但是,它们的连接方式使得从任意城市都可以走到其他的任何城市。 一天,starhder到了编号为k的城市。他计划从城市k开始,游遍城市m1,m2,m3……,mj(不一定要按这个顺序旅游)。每个城市mi都是不同的,并且,也与k不同。Starhder ——就像每一个旅行家一样,携带的钱总是有限的,所以,他要以最短的路程旅行完所有的城市(从城市k开始)。于是,他请你帮助计算一下,旅游完上述的城市最短需要多少路程。 输入

数据结构实验—栈及其应用

《算法与数据结构》课程实验报告

一、实验目的 1.熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈 的基本操作在栈的顺序存储结构。 2.实现栈的顺序存储结构,通过实验深入理解栈的操作特点。 二、实验内容及要求 1.实现栈的存储结构及相关操作:进栈、出栈、取栈顶元素等。 2.使用该栈完成对一个字符串的逆序输出。 3.使用该栈完成判断表达式的括号是否匹配。 4.对算术表达式求值。 三、系统分析 (1)数据方面:该栈数据元素类型采用浮点型,在此基础上进行栈的基本操作,并可将栈中数据使用文本文档保存。在栈的应用中,采用的是存储字符元素类型的栈,并进行对字符的相关操作。 (2)功能方面:能实现栈的一些基本操作,主要包括: 1.进栈操作:若栈不满,则将元素x插入至栈的栈顶,若栈满则进行溢出 处理。 2.出栈操作:若栈不空,则函数返回该栈栈顶的元素,并且栈顶指针退1。 3.获取栈顶元素:若栈不空,则函数返回栈顶元素。 4.判断栈是否为空、判断栈是否满。 5.计算栈中元素个数:直接返回栈中元素个数。 6.清空栈内容:将栈顶指针赋为初始值。 7.保存数据:将栈中元素数据保存至文本文档中。 四、系统设计 (1)设计的主要思路 顺序栈可以采用顺序表作为其存储表示,为此,在顺序栈的声明中用顺序表定义它的存储空间。存放栈元素的数组的头指针为*elements,该数组最大能允许存放元素个数为maxSize,当前栈顶位置由数组下标指针top知识。并规定如果栈不空时,elements[0]为栈中第一个元素。由于实验中还需完成栈的相关应用,故使用两个菜单分别完成栈的基本操作与栈的应用调试。 (2)数据结构的设计 顺序栈定义为只允许在表的末端进行插入和删除的线性表。允许插入和删除的一端叫做栈顶,而不允许插入和删除的另一端叫做栈底。当栈中没有任何元素时则成为空战。即栈又被称为后进先出的线性表,故与线性表的相关操作类似,

数据结构——顺序栈的基本操作

#include using namespace std; # define STACK_INIT_SIZE 100 # define STACKINCREMENT 10 typedef struct { int * base; int * top; int stacksize;//当前栈可使用的最大容量 } SqStack; void InitStack(SqStack &S)//构造一个空栈 { S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!S.base) {cout<<"存储分配失败!!!"<=S.stacksize) { S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); if(!S.base) cout<<"存储分配失败!!!"<

数据结构实验报告--图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e)

{ int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: "; cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } } template void MGraph::DFSTraverse(int v) { cout << vertex[v]; visited[v] = 1; for(int j = 0; j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0) DFSTraverse(j); } template void MGraph::BFSTraverse(int v) { int Q[MaxSize]; int front = -1, rear = -1; cout << vertex[v]; visited[v] = 1; Q[++rear] = v; while(front != rear) { v = Q[++front]; for(int j = 0;j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0){ cout << vertex[j]; visited[j] = 1;

数据结构利用栈实现递归

利用栈实现递归参考程序1(Turbo2.0环境): #define MAXSIZE 100 #include struct stack{ int data[MAXSIZE]; int top; }; void init(struct stack *s){ s->top=-1; } int empty(struct stack *s){ if(s->top==-1) return 1; else return 0; } void push(struct stack *s,int i){ if(s->top==MAXSIZE-1){ printf("Stack is full\n"); return; } s->top++; s->data[s->top]=i; } int pop(struct stack *s){ if(empty(s)){ printf("stack is empty"); return -1; } return(s->data[s->top--]); } void trans(int num){ struct stack s; int k; init(&s); while(num){ k=num%16; push(&s,k); num=num/16; } while(!empty(&s)){ k=pop(&s); if(k<10)

printf("%d",k); else printf("%c",k+55); } printf("\n"); } main(){ int num; clrscr(); printf("Input a num,-1 to quit:\n"); scanf("%d",&num); while(num!=-1){ trans(num); scanf("%d",&num); } } 参考程序2:(C++/VC环境) #define STACK_INIT_SIZE 100//存储空间初始分配量 #define OVERFLOW -1 #define OK 1 #define STACKINCREMENT 10//存储空间分配增量 #define ERROR 0 #define TRUE 1 #define FALSE 0 #include "stdio.h" #include "stdlib.h" #include "malloc.h" #include "iostream.h" typedef int status; typedef char SElemType; typedef struct{//顺序栈的定义 SElemType *base; SElemType *top; int stacksize; }SqStack; status InitStack(SqStack &S){//构造一个空栈S S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }

(完整word版)顺序栈基本操作实验报告

数据结构实验三 课程数据结构实验名称顺序栈基本操作第页 专业班级学号 姓名 实验日期:年月日评分 一、实验目的 1.熟悉并能实现栈的定义和基本操作。 2.了解和掌握栈的应用。 二、实验要求 1.进行栈的基本操作时要注意栈"后进先出"的特性。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。 2.编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。 主要功能描述如下: (1)从键盘上输入表达式。 (2)分析该表达式是否合法: ?a) 是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。 ?b) 是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。 ?c) 若是其它字符,则返回错误信息。 (3)若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。 程序中应主要包含下面几个功能函数: ?l void initstack():初始化堆栈 ?l int Make_str():语法检查并计算

?l int push_operate(int operate):将操作码压入堆栈 ?l int push_num(double num):将操作数压入堆栈 ?l int procede(int operate):处理操作码 ?l int change_opnd(int operate):将字符型操作码转换成优先级 ?l int push_opnd(int operate):将操作码压入堆栈 ?l int pop_opnd():将操作码弹出堆栈 ?l int caculate(int cur_opnd):简单计算+,-,*,/ ?l double pop_num():弹出操作数 四、实验步骤 (描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果) 第一题: #include using namespace std; #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 #define OVERFLOW -1 #define OK 1 #define NO -1 #define NULL 0 typedef int Status; typedef char SElemType; typedef struct { SElemType *base; //在栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 } SqStack; Status Initstack(SqStack &S)//构造一个空栈S { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize= STACK_INIT_SIZE; return OK; }//InitStack Status StackEmpty(SqStack &S) { if(S.base==S.top)

数据结构图的存储结构及

数据结构图的存储结构及基本操作

1.实验目的 通过上机实验进一步掌握图的存储结构及基本操作的实现。 2.实验内容与要求 要求: ⑴能根据输入的顶点、边/弧的信息建立图; ⑵实现图中顶点、边/弧的插入、删除; ⑶实现对该图的深度优先遍历; ⑷实现对该图的广度优先遍历。 备注:单号基于邻接矩阵,双号基于邻接表存储结构实现上述操作。 3.数据结构设计 逻辑结构:图状结构 存储结构:顺序存储结构、链式存储结构 4.算法设计 #include #include #include #define MAX_VERTEX_NU M 20 typedef struct ArcNode { int adjvex; struct ArcNode *nextarc;

}ArcNode; typedef struct VNode { char data[2]; //顶点就设置和书上V1等等一样吧 ArcNode *firstarc; }VNode,AdjList[MAX _VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum,arcnum; }ALGraph; typedef struct { int data[MAX_VERTEX_ NUM+10]; int front; int rear; }queue; int visited[MAX_VERTE X_NUM]; queue q; int main() { ALGraph G; int CreateUDG(ALGraph &G); int DeleteUDG(ALGraph &G); int InsertUDG(ALGraph &G); void BFSTraverse(ALGrap h G, int (*Visit)(ALGraph

数据结构 用栈 实现 背包问题

数据结构用栈实现背包问题 #include using namespace std; #define CAPACITY 10; //设置包的容量 //#define MaxSize 10; //包中可放物品最大数目 struct Myitem { int item_size; int item_id; }; typedef Myitem ElemType; struct Knapsack { ElemType item[10]; int Length; int top; }; void InitKnap(Knapsack &K); //函数1----将包清空 void Push_in(Knapsack &K,int item,int id) ; //函数2----将物品放入包中 void Pop_out(Knapsack &K); //函数3----将最近放进的物品拿出来 void ShowKnap(Knapsack &K); //函数4----依次展示包中的物品 void Knapsack_Solvation(Knapsack &K,int Items[],int Len); //函数5----寻找能刚好占据包所有空间的物品组合 //***主函数***// void main() { int Len; int Items[]={1,3,4,5,6,7}; //准备好物品 Len=6; Knapsack knapSack; InitKnap(knapSack); //初始化 Knapsack_Solvation(knapSack,Items,Len);

数据结构(C语言)栈的基本操作

实验名称栈的基本操作 实验目的 掌握栈这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作: (1)初始化栈; (2)判栈为空; (3)出栈; (4)入栈。 算法设计分析 (一)数据结构的定义 struct stackNode{ int data; struct stackNode *nextPtr; }; typedef struct stackNode listStact; typedef listStact *stackNodePtr; (二)总体设计 程序由主函数、入栈函数,出栈函数,删除函数判官是否为空函数和菜单函数组成。 (1)主函数:调用各个函数以实现相应功能

(三)各函数的详细设计: Function1: void instruct() //菜单 (1):使用菜单显示要进行的函数功能; Function2:void printStack(stackNodePtr sPtr) //输出栈 (1):利用if判断栈是否为空; (2):在else内套用while(头指针不为空条件循环)循环输出栈元素; Function3:void push(stackNodePtr *topPtr,int value //进栈 (1):建新的头指针; (2):申请空间; (3):利用if判断newPtr不为空时循环进栈 (4):把输入的value赋值给newPtr,在赋值给topPtr,再指向下一个位置; Function4:int pop(stackNodePtr*topPtr) //删除 (1):建新的头指针newPtr; (2):利用if判断newPtr是否为空,再删除元素。 (3):把topPtr等于newPtr,把头指针指向的数据赋值给topValue,输出要删除的数据值,头指针指向下一个位置,并清空newPtr; (4):完成上述步骤后,return toPvalue,返回;

数据结构图实验报告

数据结构教程 上机实验报告 实验七、图算法上机实现 一、实验目的: 1.了解熟知图的定义和图的基本术语,掌握图的几种存储结构。 2.掌握邻接矩阵和邻接表定义及特点,并通过实例解析掌握邻接矩阵和邻接表的类型定义。 3.掌握图的遍历的定义、复杂性分析及应用,并掌握图的遍历方法及其基本思想。 二、实验内容: 1.建立无向图的邻接矩阵 2.图的xx优先搜索 3.图的xx优先搜索 三、实验步骤及结果: 1.建立无向图的邻接矩阵: 1)源代码: #include "stdio.h" #include "stdlib.h" #define MAXSIZE 30 typedefstruct{charvertex[MAXSIZE];//顶点为字符型且顶点表的长度小于MAXSIZE intedges[MAXSIZE][MAXSIZE];//边为整形且edges为邻近矩阵

}MGraph;//MGraph为采用邻近矩阵存储的图类型 voidCreatMGraph(MGraph *g,inte,int n) {//建立无向图的邻近矩阵g->egdes,n为顶点个数,e为边数inti,j,k; printf("Input data of vertexs(0~n-1): \n"); for(i=0;ivertex[i]=i; //读入顶点信息 for(i=0;iedges[i][j]=0; //初始化邻接矩阵 for(k=1;k<=e;k++)//输入e条边{}printf("Input edges of(i,j): "); scanf("%d,%d",&i,&j); g->edges[i][j]=1; g->edges[j][i]=1;}void main(){inti,j,n,e; MGraph *g; //建立指向采用邻接矩阵存储图类型指针 g=(MGraph*)malloc(sizeof(MGraph));//生成采用邻接举证存储图类型的存储空间}2)运行结果: printf("Input size of MGraph: "); //输入邻接矩阵的大小scanf("%d",&n); printf("Input number of edge: "); //输入邻接矩阵的边数scanf("%d",&e);

数据结构答案第3章栈学习指导

第3章栈 3.1 知识点分析 1.栈的基本概念 (1)栈是一种特殊的、只能在表的一端进行插入或删除操作的线性表。允许插入、删除的一端称为栈顶,另一端称为栈底。 (2)栈的逻辑结构和线性表相同,其最大特点是“后进先出”。 (3)栈的存储结构有顺序栈和链栈之分,要求掌握栈的C语言描述方法。 (4)重点掌握在顺序栈和链栈上实现:进栈、出栈、读栈顶元素、判栈空和判栈满等基本操作。 (5)熟悉栈在计算机的软件设计中的典型应用,能灵活应用栈的基本原理解决一些实际应用问题。 2.顺序栈 顺序栈是利用地址连续的存储单元依次存放从栈底到栈顶的元素,同时附设栈顶指针来指示栈顶元素在栈中的位置。 (1)用一维数组实现顺序栈 设栈中的数据元素的类型是字符型,用一个足够长度的一维数组s来存放元素,数组的最大容量为MAXLEN,栈顶指针为top,则顺序栈可以用C(或C++)语言描述如下:#define MAXLEN 10 // 分配最大的栈空间 char s[MAXLEN];// 数据类型为字符型 int top;// 定义栈顶指针 (2)用结构体数组实现顺序栈 顺序栈的结构体描述: #define MAXLEN 10 // 分配最大的栈空间 typedef struct // 定义结构体 { datatype data[MAXLEN];// datatype可根据用需要定义类型 int top;// 定义栈顶指针 }SeqStack; SeqStack *s;// 定义S为结构体类型的指针变量 (3)基本操作的实现要点 (a)顺序栈进栈之前必须判栈是否为满,判断的条件:s->top==MAXLEN–1。 (b)顺序栈出栈之前必须判栈是否为空,判断的条件:s->top==–1。 (c)初始化栈(置栈空):s->top==–1。 (d)进栈操作: if (s->top!=MAXLEN–1)// 如果栈不满 { s->top++;// 指针加1 s->data[s->top]=x;// 元素x进栈 } (e)出栈操作: if (s->top!=–1)// 如果栈不空 { *x=s->data[s->top];// 出栈(即栈顶元素存入*x) s->top––;// 指针加1 } (f)读栈顶元素 if (s->top!=–1)// 如果栈不空 return(s->data[s->top]);// 读栈顶元素,但指针未移动

相关主题
文本预览
相关文档 最新文档