《算法与数据结构》实验报告实验3--栈与队列的应用

《算法与数据结构》实验报告实验3--栈与队列的应用
《算法与数据结构》实验报告实验3--栈与队列的应用

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

姓名学号专业班级计算机类1301

实验3栈与队列的应用

指导教师实验名称

实验目的

●了解并掌握栈与队列的概念与定义

●能够实现并运用栈与队列

●熟练运用栈与队列的基本操作

●使用栈实现回溯算法

实验环境

●个人计算机一台,CPU主频1GHz以上,1GB以上内存,2GB以上硬盘

剩余空间。

●Windows2000、Windows XP或Win 7操作系统

●Code::Blocks(版本12.11或近似版本,英文版),或VC++ 6.0

实验内容

1 基本部分(必做)

1.链式栈的创建与操作

设链式栈中元素的数据类型为整型,编写函数实现以下操作:

(1)链式栈的初始化

(2)链式栈的输出(从栈顶到栈底)

(3)链式栈的判空操作

(4)链式栈入栈操作

(5)链式栈的出栈操作

(6)取栈顶元素的值

注:链式栈可不带头节点

源代码:ds6.c 2.循环队列的创建与操作

设循环队列中元素的数据类型为整型,编写函数实现以下操作:

(1)循环队列的初始化

(2)循环队列的入栈

(3)循环队列的出栈

(4)取循环队列的栈顶元素

(5)循环队列的输出(从栈顶到栈底)

源代码:ds7.c 3.符号平衡问题

在语言中往往需要判断一些符号是否是成对出现的,比如{}、[]、()。如何让判断符号的对称也是很多语言的语法检查的首要任务。

设计一个函数来检查表达式中的符号()、[]、{}是否平衡。若平衡,返回1;若不平衡返回0。

例如:

a(dda){[dfsafd[dfsd]](((fdsd)dfd))dfd}是符号平衡的。

{ad[x(df)ds)]}不是符号平衡的。

源代码:ds8.c

实验代码:

1.

#include

#define MAXSIZE maxlen

typedef int elemtype;

typedef struct stacknode

{

elemtype data;

struct stacknode *next;

}StackNode;

typedef struct

{

StackNode *top;

}LinkStack;

int *InitStack(LinkStack *S);//初始化链式栈

int *Push(LinkStack *S);//入栈函数

int *view(LinkStack *S);//输出函数

int *Pop(LinkStack *S);//出栈函数

int StackTop(LinkStack *S);//取栈顶函数

main()

{

LinkStack *S;

int a;

char k;

S=InitStack(S);

if(S->top==NULL)

{

printf("该链式栈为空!");

}

Push(S);

printf("按任意键开始出栈!");

getchar();

getchar();

Pop(S);

a=StackTop(S);

printf("栈顶元素为%d",a);

printf("程序运行完毕,是否重新运行(y/n):");

scanf("%s",&k);

if(k=='y')

{

main();

}

}

int *InitStack(LinkStack *S)

{

S=(LinkStack*)malloc(sizeof(LinkStack));

S->top=NULL;

return(S);

}

int *Push(LinkStack *S)

{

int n,i,item;

StackNode *p;

printf("请输入即将入栈的数据个数:");

scanf("%d",&n);

for(i=0;i

{

printf("请输入第%d个数:",i+1);

scanf("%d",&item);

p=(LinkStack*)malloc(sizeof(StackNode));

p->data=item;

p->next=NULL;

p->next=S->top;

S->top=p;

}

view(S);

return(S);

}

int *view(LinkStack *S)

{

StackNode *p;

if(S->top==NULL)

{

printf("链式栈为空!");

return(0);

}

else printf("该链式栈从栈顶到栈底数据如下:\n");

for(p=S->top;p!=NULL;p=p->next)

{

printf("%d\n",p->data);

}

}

int *Pop(LinkStack *S)

{

StackNode *p;

int item;

char k;

p=S->top;

if(S->top==NULL)

{

printf("链式栈为空!");

return(0);

}

else

{

item=p->data;

printf("出栈数据为%d\n",item);

S->top=p->next;

free(p);

view(S);

}

printf("是否继续出栈(y/n):");

scanf("%s",&k);

if(k=='y')

{

Pop(S);

}

else return(S);

}

int StackTop(LinkStack *S)

{

if(S->top==NULL)

{

printf("该链式栈为空!");

}

return(S->top->data);

}

2.

#include

#define MAXSIZE 30

typedef int elemtype;

typedef struct

{

elemtype data[MAXSIZE];

int front,rear;

}seqqueue;

int a=0;//全局变量

int InitQueue(seqqueue *Q);//初始化队列函数

int view(seqqueue *Q);//输出函数

int EnQueue(seqqueue *Q);//入队函数

int DeQueue(seqqueue *Q);//出队函数

main()

{

seqqueue *Q;

Q=InitQueue(Q);

if(Q->front==Q->rear)

{

printf("该队列为空!");

}

EnQueue(Q);

printf("按任意键开始出栈!");

getchar();

getchar();

DeQueue(Q);

printf("程序运行完毕,是否重新运行(y/n):"); }

int InitQueue(seqqueue *Q)

{

Q=(seqqueue*)malloc(sizeof(seqqueue));

Q->front=Q->rear=0;

return(Q);

}

int EnQueue(seqqueue *Q)

{

int n,i,item;

printf("请输入即将入队的数据个数:");

scanf("%d",&n);

if(a>MAXSIZE)

{

printf("该队列已满!");

return(0);

}

else for(i=0;i

{

printf("请输入第%d个数:",i+1);

scanf("%d",&item);

Q->data[Q->rear]=item;

Q->rear=(Q->rear+1)%MAXSIZE;

a++;

}

view(Q);

return(Q);

}

int view(seqqueue *Q)

{

seqqueue *r;

int i,j;

if(a==0)

{

printf("该队列为空!");

return(0);

}

else printf("该队列从栈顶到栈底数据如下:\n");

for(i=0,j=Q->front;i

{

printf("%d\n",Q->data[j]);

}

return(Q);

}

int DeQueue(seqqueue *Q)

{

elemtype item;

char k;

if(a==0)

{

printf("该队列为空!");

return(0);

}

else

{

item=Q->data[Q->front];

Q->front=(Q->front+1)%MAXSIZE;

printf("出队数据为%d\n",item);

a--;

view(Q);

}

printf("是否继续出栈(y/n):");

scanf("%s",&k);

if(k=='y')

{

DeQueue(Q);

}

else return(Q);

}

#include "stdio.h"

#include "stdlib.h"

#define MAXSIZE 100

typedef struct

{

char data[MAXSIZE];

int top;

} stack;

stack *InitStack(stack *s)

{

s=(stack *)malloc(sizeof(stack));

s->top=-1;

return s;

}

int f(stack *s)

{

int i=0,flag=1;

char str[MAXSIZE];

printf("请输入表达式:");

scanf("%s",str);

for(i=0;str[i]!='\0';i++)

{

if(str[i]=='('||str[i]=='['||str[i]=='{')

{

s->top++;

s->data[s->top]=str[i];

}

if(str[i]==')'||str[i]==']'||str[i]=='}')

{

if(s->top>=0)

{

if(s->data[s->top]==str[i]) s->top--;

else{

flag=0;

break;

}

}

else{

flag=0;

break;

}

}

}

if(s->top!=-1)flag=0;

return flag;

}

int main()

{

int n;

stack *s;

s=InitStack(s);

n=f(s);

if(n==1) printf("表达式中符号平衡\n");

else printf("表达式中符号0平衡\n");

}

使用以上操作,即可完成题目要求。

总结与思考

感觉越来越难了,靠自己的力量完全完成很难,自己写出来的程序运行不下去。希望我转专业成功,但依旧会努力。谢谢老师!干吧得~

教师评定

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

实验编号: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.顺序储存: 代码部分: 栈" << endl; cout << " 2.出栈" << endl; cout << " 3.判栈空" << endl; cout << " 4.返回栈顶部数据" << endl; cout << " 5.栈长" << endl; cout << " 0.退出系统" << endl;

cout << "你的选择是:" ; } 链式储存: 代码部分: 栈"<>select; switch (select){ case 0:break; case 1: cout<<"push data:"; cin>>e; if(push(L,e)){

数据结构堆栈与队列实验报告

实验二堆栈和队列 实验目的: 1.熟悉栈这种特殊线性结构的特性; 2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算; 3.熟悉队列这种特殊线性结构的特性; 3.熟练掌握队列在链表存储结构下的基本运算。 实验原理: 堆栈顺序存储结构下的基本算法; 堆栈链式存储结构下的基本算法; 队列顺序存储结构下的基本算法; 队列链式存储结构下的基本算法; 实验内容: 第一题链式堆栈设计。要求 (1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化StackInitiate(S),非空否StackNotEmpty(S),入栈StackiPush(S,x),出栈StackPop(S,d),取栈顶数据元素StackTop(S,d); (2)设计一个主函数对链式堆栈进行测试。测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈并在屏幕上显示出栈的数据元素; (3)定义数据元素的数据类型为如下形式的结构体, Typedef struct { char taskName[10]; int taskNo; }DataType; 首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。 第二题对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求: (1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空; (2)编写主函数进行测试。 程序代码: 第一题: (1)源程序"LinStack.h"如下: #define NULL 0 typedef struct snode { DataType data; struct snode *next; } LSNode; /*(1)初始化StackInitiate(LSNode ** head) */ void StackInitiate(LSNode ** head) /*初始化带头结点链式堆栈*/

数据结构实验二-栈和队列的基本操作与应用

实验报告 课程名称_______数据结构实验__________________ 实验项目___ 栈和队列的基本操作与应用____ 实验仪器_____________________________________ 系别 ___ 计算机学院_______________ 专业 __________________ 班级/学号______ _________ 学生姓名_____________________ __ 实验日期__________________ 成绩_______________________ 指导教师____ __________________

一、实验内容: 本次实验主要内容是表达式求值,主要通过栈和队列来编写程序,需要实现整数运算其中需要实现的功能有加减乘除以及括号的 运用,其中包含优先级的判断。 二、设计思想 1.优先级中加减、乘除、小括号、以及其他可以分组讨论优先 级 2.优先级关系用“>”“<”“=”来表示三种关系 3.为实现运算符优先使用两个栈:OPTR 运算符栈与OPND操作 符栈 4.运用入栈出栈优先级比较等方式完成运算 三、主要算法框架 1.建立两个栈InitStack(&OPTR); InitStack(&OPND); 2.Push“#”到 OPTR 3.判断优先级做入栈出栈操作 If“<” Push(&OPTR, c); If“=” Pop(&OPTR, &x) If“>” Pop(&OPTR, &theta); Pop(&OPND, &b);

Pop(&OPND, &a); Push(&OPND, Operate(a, theta, b)); 四、调试报告 遇到的问题与解决 1.C语言不支持取地址符,用*S代替&S来编写代码 2.一开始没有计算多位数的功能只能计算一位数,在几个中间 不含运算符的数字中间做p = p*10+c运算。代码如下:p = p * 10 + c - '0'; c = getchar(); if (In(c)) { Push(&OPND, p); p = 0; } 主要算法改进设想: 1.可以用数组储存优先级 2.可以用C++编写,C++支持取地址符&。 五、实验总结

栈的操作(实验报告)

实验三栈和队列 3.1实验目的: (1)熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现; (2)熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。 3.2实验要求: (1)复习课本中有关栈和队列的知识; (2)用C语言完成算法和程序设计并上机调试通过; (3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。 3.3基础实验 [实验1] 栈的顺序表示和实现 实验内容与要求: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍历顺序栈 (6)置空顺序栈 分析: 栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。 对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p->top= =MAXNUM-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。 注意: (1)顺序栈中元素用向量存放 (2)栈底位置是固定不变的,可设置在向量两端的任意一个端点 (3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置 参考程序: #include #include #define MAXNUM 20

队列实验报告

一.实验项目名称 循环队列和链式队列的创建 二、实验目的 1、掌握队列的特点 (先进先出 FIFO) 及基本操作 ,如入队、出队等, 2、队列顺序存储结构、链式存储结构和循环队列的实现,以便在 实际问题背景下灵活应用。 三、实验内容 1.链式队列的实现和运算 2.循环队列的实现和运算 四、主要仪器设备及耗材 VC++6.0 运行环境实现其操作 五.程序算法 (1)循环队列操作的算法 1>进队列 Void enqueue (seqqueue &q, elemtype x) { if ((q.rear+1)%maxsize = = q.front) cout<< ” overflow”; else { q.rear=(q.rear+1)%maxsize; // 编号加 1 或循环回第一个单元 q.queue[q.rear]=x; } } 2>出队列 Void dlqueue(seqqueue &q ) { if (q.rear= =q.front)cout<< ” underflow”; else q.front =(q.front+1)%maxsize; } 3>取对头元素

elemtype gethead(seqqueue q ) { if(q.rear= =q.front) { cout<<” underflow;” return NULL;} else return q.queue[(q.front+1)%maxsize]; //front 指向队头前一个位置 } 4>判队列空否 int empty(seqqueue q ) { if (q.rear= =q.front) else return 0; reurn 1; } (2).链队列操作的算法 1>.链队列上的初始化 void INIQUEUE( linkqueue&s) {link *p; p=new link; p->next=NULL;//p 是结构体指针类型,用 s.front=p;//s 是结构体变量,用. s.rear=p;//头尾指针都指向头结点 -> } 2>.入队列 void push(linkqueue &s, elemtype x) { link*p;//p 是结构体指针类型,用-> p=new link; p->data=x; p->next=s.rear->next;//s 是结构体变量,用s.rear->next=p; s.rear=p;//插入最后 . } 3>判队空 int empty( linkqueue s ) {if (s.front= =s.rear) return 1; else return 0; } 4>.取队头元素 elemtype gethead( linkqueue s ) { if (s.front= =s.rear) else retuen return NULL; s.front->next->data; }

实验二_栈、队列地实现与应用

实验二栈、队列的实现及应用 实验课程名:数据结构与算法 专业班级:学号::

/*构造空顺序栈*/ int InitStack(SqStack *S) //InitStack() sub-function { S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if (!S->base) { printf("分配空间失败!\n"); return (ERROR); } S->top = S->base; S->stacksize = STACK_INIT_SIZE; printf("栈初始化成功!\n"); return (OK); } //InitStack() end /*取顺序栈顶元素*/ int GetTop(SqStack *S, SElemType *e) //GetTop() sub-function { if (S->top == S->base) { printf("栈为空!\n"); //if empty SqStack return (ERROR); } *e = *(S->top - 1); return (OK); } //GetTop() end /*将元素压入顺序栈*/ int Push(SqStack *S) //Push() sub-function { SElemType e; if (S->top - S->base>S->stacksize) { S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT*sizeof(SElemType))); if (!S->base) { printf("存储空间分配失败!\n"); return (ERROR); } S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } fflush(stdin);//清除输入缓冲区,否则原来的输入会默认送给变量x

数据结构实验报告(2015级)及答案

数据结构实验报告(2015级)及答案

《数据结构》实验报告 专业__信息管理学院______ 年级__2015级___________ 学号___ _______ 学生姓名___ _ _______ 指导老师____________ 华中师范大学信息管理系编

I 实验要求 1.每次实验中有若干习题,每个学生至少应该完成其中的两道习题。 2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率。 3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。 4.上机结束后,应整理出实验报告。书写实验报告时,重点放在调试过程和小节部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力的目的。 II 实验内容 实验一线性表 【实验目的】 1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。 2.通过编程、上机调试,进一步理解线性表的基本概念,熟练运用C语言实现线性表基本操作。 3.熟练掌握线性表的综合应用问题。 【实验内容】 1.一个线性表有n个元素(n

的顺序不变。设计程序实现。要求:采用顺序存储表示实现;采用链式存储表示方法实现;比较两种方法的优劣。 2. 从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。 要求: ①指定的值x由键盘输入; ②程序能处理空链表的情况。 3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。 要求: ①该算法用函数(非主函数)实现; ②在主函数中调用创建链表的函数创建一个单链表, 并调用该函数,验证算法的正确性。 LinkedList Exchange(LinkedList HEAD,p)∥HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后 继结点交换。 {q=head->next;∥q是工作指针,指向链表中当前待处理结点。 pre=head;∥pre是前驱结点指针,指向q的前驱。 while(q!=null && q!=p){pre=q;q=q->next;} ∥

栈和队列综合实验报告

栈和队列综合实验报告 一、实验目的 (1)能够利用栈和队列的基本运算进行相关操作。 (2)进一步熟悉文件的应用 (3)加深队列和栈的数据结构理解,逐步培养解决实际问题的编程能力。 二、实验环境 装有Visual C++的计算机。 本次实验共计4学时。 三、实验内容 以下两个实验任选一个。 1、迷宫求解 设计一个迷宫求解程序,要求如下: 以M × N表示长方阵表示迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 能任意设定的迷宫 (选作)如果有通路,列出所有通路 提示: 以一个二维数组来表示迷宫,0和1分别表示迷宫中的通路和障碍,如下图迷宫数据为:11

01 01 01 01 01 01 01 11 入口位置:1 1 出口位置:8 8 四、重要数据结构 typedef struct{ int j[100]; int top;栈顶指针,一直指向栈顶 }stack;//存放路径的栈 int s[4][2]={{0,0},{0,0},{0,0},{0,0}}; //用于存放最近的四步路径坐标的数组,是即使改变的,即走一步,便将之前的坐标向前移一步,将最早的一步坐标覆盖掉,新的一步放入数组末尾其实功能和队列一样。 其作用是用来判断是否产生了由于本程序算法产生的“田”字方格内的死循环而准备的,用于帮助跳出循环。 五、实现思路分析 if(a[m][n+1]==0&&k!=3){ n++; k=1; o=0; }else if(a[m+1][n]==0&&k!=4){ m++;

k=2; o=0; }else if(a[m][n-1]==0&&k!=1){ n--; k=3; o=0; }else if(a[m-1][n]==0&&k!=2){ m--; k=4; o=0; }else{ o++;} if(o>=2){ k=0; }//向所在方格的四个方向探路,探路顺序为→↓←↑(顺时针),其中if判断条件内的&&k!=n和每个语句块中的对k赋值是为防止其走回头路进入死循环,而最后一个else{}内语句是为了防止进入死路时,不能走回头路而造成的死循环。 push(q,m,n);//没进行一次循环都会讲前进的路径入栈。 if (pushf(&s[0][0],m,n)==0){ k=3;}//用来判断是否产生了由于本程序探路算法产生的“田”字方格内的死循环而准备的,用于帮助跳出田字循环。同时会将路径存入用于下次判断 六、程序调试问题分析 最开始写完时是没有死路回头机制的,然后添加了两步内寻路不回头机制。 第二个是“田”字循环问题,解决方法是加入了一个记录最近四步用的数组和一个判断田字循环的函数pushf。

数据结构集中上机实验报告

XX大学 信息与计算科学专业 2008级《数据结构》集中上机 设计题目:迷宫求解(非递归求解)设计时间:2010-2011学年第一学期

目录 一、实验内容 (2) 二、需求分析 (2) 三、总体设计 (2) (一)存储结构 (2) (二)流程图 (3) 四、详细设计 (3) (一)基本算法解析 (3) (二)为实现算法,需要的象的数据类型 (4) (三)函数的调用关系 (5) (四)算法时间、空间复杂度 (5) 五、代码 (5) 六、运行结果分析 (10) (一)迷宫路径探索成功 (10) (二)迷宫路径未找到的情况 (13) (三)程序的优缺点与改进 (13) 七、参考文献 (14) 八、心得体会 (14)

一、实验内容 任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出。 二、需求分析 1、可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求使用非递归算法。 2、用户可以根据自己的需求进行输入所需的迷宫,其中1表示迷宫的墙壁,0表示迷宫的通路,从而建立迷宫。 3、可以自行输入迷宫的入口和出口坐标。 4、程序执行的命令包括: (1)构造栈函数。其中包括了构造空栈InitStack;压入新数据元素Push;栈顶元素出栈Pop。 (2)构造求迷宫路径函数。其中定义了二维数组maze[M][N]存取迷宫数据;输出找到的通路MazePath。 (3)建立一个迷宫initmaze。其中包括输入迷宫行数列数以及各行各列;加一圈围墙并输出迷宫。 三、总体设计 (一)存储结构: 首先用二维数组存储迷宫数据,迷宫数据由用户输入。 一个以链表结构作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东南西北所用代表数字,自行定义)。 1.从入口出发,顺着某一个方向进行探索,若能走通,继续往前走,否则沿原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到但没能到达出口,则所设置的迷宫没有通路。 迷宫的入口点的下标(a,b),出口点的下标(m,n)。为方便,可在迷宫周围加一周障碍。对于迷宫的任意位置,均可约定有东西南北4个方向可以走通。经过的位置把0变成-1,输出迷宫路径。 2本程序有三个模块; (1)主程序模块 (2)三个模块即其对象,实现栈链表抽象数据类型 (3)迷宫存储迷宫,寻路径,输出迷宫。

实验二栈队列的实现及应用

百度文库-让每个人平等地提升自我 实验二栈、队列的实现及应用 实验课程名:数据结构与算法 专业班级:_ 学号:__________ 姓名: _ 实验时间: ____ 实验地点:指导教师:冯珊__________ 一、实验目的 1掌握栈和队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用。 2、掌握栈和队列的特点,即先进后出与先进先出的原则。 3、掌握栈和队列的基本操作实现方法。 /*顺序栈的存储类型*/ typedef struct

1 2 3 4 5远 兀 1 一 7U- 元 谴 段 囑 :> o 1 2 3 R * 元 元 栈 書 t 出 一 ^ 零 遐 次 :± 谨 虚 1 2 3 ^ 5 I B

D 认戯握结IVl 匚on&ol eAp pli cation!\[>ebu g\Con 5 o-leApp li cation 1 .exe :1 刖人操作谊睪代码(05):2 : h E s 选 的 操 一 兀 一 b 一 丁 一 丁 栈 ? 遐 次 嘆 區 1 2 3 4 5 5 ^ 元 元 栈 S 退 、 灵 岀 祓 S I ■ i 9 I I I i 主 至 ..T' 一 兀 元 栈 £ 1 2 3 4 5 \Z

百度文库 -让每个人平等地提升自我 P入操隹选择代码(0-5>:4 派元素的是 ; 栈 化 出 取 示 艮 i元一一 选 的 操 元 -> 入 中 >c 1- 苴翻(05): 5 栈 化 亍 1 2 元 元 Is 务一(2):完成下列程序,该程序实现栈的链式存储结构,构建链栈(栈中的元素依次为China , Japan, France,India ,Australia ),依次进行进栈和出栈操作,判断栈空和栈满操作,返回栈顶元素操作。 要求生成链栈时,从键盘上读取数据元素。 (1)源代码:#i nclude<> #in clude<> #in clude<> # define OK 1 # define ERROR 0 typedef char DataType; /*链式栈的存储类型*/ typedef struct SNode

栈溢出实验报告

华中科技大学计算机学院《信息系统应用安全》实验报告 实验名称团队成员: 注:团队成员贡献百分比之和为1 教师评语: 一.实验环境 ? 操作系统:windows xp sp3 ? 编译平台:visual c++ 6.0 ? 调试环境:ollydbg 二.实验目的 1. 掌握缓冲区溢出的原理; 2. 掌握缓冲区溢出漏洞的利用技巧; 3. 理解缓冲区溢出漏洞的防范措施。 三.实验内容及步骤 1. 缓冲区溢出漏洞产生的的基本原理和攻击方法 ? 缓冲区溢出模拟程序 由于拷贝字符串时产生缓冲区溢出,用“abcd”字符串的值覆盖了原来eip的值,所以 main函数返回时eip指向44434241,引发访问异常。 ? 运行命令窗口的shellcode 由于把main函数的返回eip地址替换成了jmp esp的地址,main函数 返回的时候就会执行我们的shellcode代码。该shellcode,运行命令窗口。 2. ms06-040 缓冲区溢出漏洞分析和利用 ? 溢出点定位 篇二:缓冲区溢出实验报告 缓 冲 区 溢 出 报 告 院系:计算机与通信工程学院 班级:信息安全10-02班 1. 实验目的 掌握缓冲区溢出的原理 掌握常用的缓冲区溢出方法 理解缓冲区溢出的危害性 掌握防范和避免缓冲区溢出攻击的方法 2. 实验工具 溢出对象:ccproxy 7.2 (1) (2)调试工具: 使用vmware虚拟机,安装ccproxy7.2进行实验调试。 3. 实验步骤 了解ccproxy 7.2 代理服务器为大家解决了很多问题,比如阻挡黑客攻击和局域网共享上网等。 ? 国内非 常受欢迎的一款代理服务器软件 ? 设置简单,使用方便 关于ccproxy6.2缓冲区溢出漏洞说明

《数据结构》2012级实验报告模板..

实验报告(一) 一、实验目的: 1.掌握VC6.0开发环境下C/C++程序的编辑、编译和运行。 2.通过实验回顾复习C语言中关于结构体、指针等知识的应用。 3.了解学习数据结构的主要方法和课程的主要知识框架。 二、实验环境: 个人电脑、Windows XP、VC6.0或以上版本。 三、实验内容、程序代码、程序测试运行界面 1.设计一个程序,输出所有小于等于n(n为一个大于2的正整数)的素数。要求:(1)每行输出10个素数;(2)尽可能采用较优的算法。 2.编写一个程序,计算任一输入的正整数的各位数字之和,并分析算法的时间复杂度。

3.编写一个程序,判断一个字符串是否为“回文”(顺读和倒读都一样的字符串称为“回文”),并分析算法的时间复杂度。 四、心得体会与建议

实验报告(二) 一、实验目的: 1.熟练掌握线性表的顺序存储结构的概念及各种基本操作的C语言实现。 2.熟练掌握线性表的链式存储结构中的单链表的概念及各种基本操作的C 语言实现。 3.了解双向链表及循环链表的基本操作。 二、实验环境: 个人电脑、Windows XP、VC6.0或以上版本。 三、实验内容、程序代码、程序测试运行界面 1.编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char),并在此基础上设计一个程序完成如下功能: (1)初始化顺序表L; (2)采用尾插法依次插入元素a,b,c,d,e; (3)输出顺序表L; (4)输出顺序表L长度; (5)判断顺序表L是否为空; (6)输出顺序表L的第3个元素; (7)输出元素a的位置; (8)在第4个位置上插入元素f; (9)输出顺序表L; (10)删除L的第3个元素; (11)输出顺序表L; (12)释放顺序表L。 程序代码如下:

数据结构-队列实验报告

《数据结构》课程实验报告 一、实验目的和要求 (1)熟悉C语言的上机环境,进一步掌握C语言的结构特点。 (2)掌握队列的顺序表示和实现。 二、实验环境 Windows7 ,VC 三、实验内容及实施 实验三:队列 【实验要求】 构建一个循环队列, 实现下列操作 1、初始化队列(清空); 2、入队; 3、出队; 4、求队列长度; 5、判断队列是否为空; 【源程序】 #include #define MAXSIZE 100 #define OK 1; #define ERROR 0; typedef struct { int *base; int front; int rear; }SqQueue;//队列的存储结构 int InitQueue(SqQueue &Q) {

Q.base=new int[MAXSIZE]; Q.front=Q.rear=0; return OK; }//队列的初始化 int EnQueue(SqQueue &Q,int e) { if((Q.rear+1)%MAXSIZE==Q.front) return ERROR; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXSIZE; return OK; }//队列的入队 int DeQueue(SqQueue &Q,int &e) { if(Q.front==Q.rear) return ERROR; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXSIZE; return OK; }//队列的出队 int QueueLength(SqQueue &Q) { int i; i=(Q.rear-Q.front+MAXSIZE)%MAXSIZE; return i; }//求队列长度 void JuQueue(SqQueue &Q) { if(Q.rear==Q.front) printf("队列为空"); else printf("队列不为空"); }//判断队列是否为空 void QueueTraverse(SqQueue &Q)

实验二 栈与队列操作实验题目

实验二栈与队列操作 实验目的: (1)理解栈与队列的结构特征和运算特征,以便在实际问题背景下灵活运用。 (2)了解复杂问题的递归算法设计。 本次实验中,下列实验项目选做一。 1、顺序栈的基本操作 [问题描述] 设计算法,实现顺序栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立顺序栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)将栈顶元素出栈。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 2、链栈的基本操作 [问题描述] 设计算法,实现链栈的各种基本操作 [基本要求] (1)初始化栈s。 (2)从键盘输入10个字符以$结束,建立带头结点的链栈。 (3)从键盘输入1个元素,执行入栈操作。 (4)完成出栈操作。 (5)判断栈是否为空。 (6)输出从栈顶到栈底元素。 (7)输出链栈的长度。 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 3、循环队列的基本操作 [问题描述] 设计算法,实现循环顺序队列的建立、入队、出队等操作。 [基本要求] (1)从键盘输入10个字符以$结束,建立循环队列,并显示结果。 (2)从键盘输入1个元素,执行入队操作,并显示结果。 (3)将队头元素出队,并显示结果。 (4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

4、只用尾指针表示的循环链表队列的综合操作 [问题描述] 假设以带头结点的的循环链表表示队列,并且只设一个指针指向队尾元素的结点(注意不设头指针),试编写队列初始化、入队、出队函数。 [基本要求及提示] (1)首先定义链表结点类型。 (2)编写带头结点的循环链表的初始化函数,只用尾指针表示。 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.初始化;2.入队;3.出队;4.退出),调用上述功能函数。 5、用标志域表示队空队满状态的循环队列的综合操作 [问题描述] 要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。 [基本要求及提示] (1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front==Q->rear,满:(Q->rear+1)%MAXSIZE==Q->front。 (2)本题不损失一个空间全部都得到利用,为此如下定义循环队列类型: Typedef struct { QueueElementType element[MAXSIZE]; int front; int rear; int tag; }SeqQueue; 此时,循环队列空和满的条件分别为: Q->front==Q->rear&&tag==0 和 Q->front==Q->rear&&tag==1 (3)编写入队函数、出队函数。 (4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。 6、利用辅助数组进行栈的逆置 [问题描述] 利用辅助栈将栈中的元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入栈;2.出栈;3.逆置;4.退出)调试运行程序。 7、利用辅助栈进行队列的逆置 [问题描述] 利用辅助栈进行队列元素逆置。 [基本要求及提示] 在主函数中编写菜单(1.入队;2.出队;3.逆置;4.退出)调试运行程序。 8、Hanoi塔问题

栈和队列及其应用实验报告

数据结构实验报告 实验名称:栈和队列及其应用 班级:12级电气本2 学号:2012081227 姓名:赵雪磊 指导教师:梁海丽 日期:2013年9月23日 数学与信息技术学院 一、实验目的

1. 掌握栈和队列的概念。 2.掌握栈和队列的基本操作(插入、删除、取栈顶元素、出队、入队等)。 3.理解栈和队列的顺序、链式存储。 二、实验要求 利用顺序栈将任意一个给定的十进制数转换成二进制、八进制、十六进制数并输出。 三、算法描述 #include "stdafx.h" #include "iomanip.h" void D10to2_8_16(int i,char radix) { char m; if(i>=radix) D10to2_8_16(i/radix,radix); if((m=i%radix+'0')>0x39) m+=7; cout << m; } void main(void) { int nDec; cout << "请输入一个十进制正整数...\n" << "nDec="; cin >> nDec; cout << "转换为二进制是:"; D10to2_8_16(nDec,2); cout << endl; cout << "转换为八进制是:0"; D10to2_8_16(nDec,8); cout << endl; cout << "转换为十六进制是:0x"; D10to2_8_16(nDec,16); cout << endl; } 四、程序清单 #include #include #define N 2 //可以控制进制转换 using namespace std; typedef struct{ int *top; int *base; int stacksize; }stack;

队列的表示及实现实验报告

陕西科技大学实验报告 班级信工082 学号200806030202 姓名李霄实验组别 实验日期2010-12-20 室温报告日期2010-12-20 成绩 报告内容:(目的和要求,原理,步骤,数据,计算,小结等) 实验名称:实验三队列的表示及实现 实验目的: 1、通过实验进一步理解队列的“先进先出”特性。 2、掌握队列的逻辑结构及顺序存储结构和链式存储结构。 3、熟练运用C语言实现队列的基本操作。 4、灵活运用队列解决实际问题。 实验内容: 1、实现链队列,并编写主函数进行测试。测试方法为:依次10、20、 30、40,然后,出对3个元素。再次入队50、60,然后出队3个元 素。查看屏幕上显示的结果是否与你分析的结果一致。 2、在1的基础上,再出队1个元素。查看屏幕上显示的结果是否与你 分析的结果一致。 3、编写主函数比较取队头元素操作和出队操作。 实验学时:2学时 实验程序 #include "stdio.h" #include "conio.h" typedef int DataType; typedef struct { DataType data; struct QNode* next; }LQNode,*PQNode; typedef struct { PQNode front,rear; }LinkQueue; int InitQueue(LinkQueue *Q) { Q->front=Q->rear=(PQNode)malloc(sizeof(LQNode));

if (!Q->front){printf("errors\n");return 0;} Q->front->next=NULL; return 1; } int QueueEmpty(LinkQueue Q) { if(Q.front==Q.rear) return 1; else return 0; } int EnQueue(LinkQueue *Q,DataType e) { PQNode p; p=(PQNode)malloc(sizeof(LQNode)); if(!p) { printf("\n\nerrors\n\n"); return 0; } p->data=e; p->next=NULL; Q->rear->next=p; Q->rear=p; return 1; } int DeQueue(LinkQueue *Q,DataType *e) { PQNode p; if( Q->front==Q->rear) { printf("\nerrors\n");

数据结构栈和队列实验报告.doc

南京信息工程大学实验(实习)报告 实验(实习)名称栈和队列日期2017.11.8 得分指导老师崔萌萌 系计算机系专业软件工程年级2016 班次(1) 姓名学号 一、实验目的 1、学习栈的顺序存储和实现,会进行栈的基本操作 2、掌握递归 3、学习队列的顺序存储、链式存储,会进行队列的基本操作 4、掌握循环队列的表示和基本操作 二、实验内容 1、用栈解决以下问题: (1)对于输入的任意一个非负十进制数,显示输出与其等值的八进制数,写出程序。(2)表达式求值,写出程序。 2、用递归写出以下程序: (1)求n!。 (2)汉诺塔程序,并截图显示3、4、5个盘子的移动步骤,写出移动6个盘子的移动次数。

3、编程实现:(1)创建队列,将asdfghjkl依次入队。(2)将队列asdfghjkl依次出队。 4、编程实现创建一个最多6个元素的循环队列、将ABCDEF依次入队,判断循环队列是否队满。 三、实验步骤 1.栈的使用 1.1 用栈实现进制的转换: 代码如下: #include #include using namespace std; int main() { stack s; //栈s; int n,radix; printf("请输入要转换的十进制非负整数: "); scanf("%d",&n); printf("请输入目标进制: "); scanf("%d",&radix);

printf("转换为%d进制: ",radix); while(n) { s.push(n%radix); n /= radix; } while(!s.empty()) { //非空 printf("%d",s.top()); s.pop(); } printf("\n"); return 0; } 运行结果如下: 2.2 求表达式的值 代码如下: #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 typedef int Status;

《数据结构》实验一

华北水利水电大学数据结构实验报告 2017~2018学年第二学期2017级计算机科学与技术(专升本)专业班级:学号:姓名: 实验一线性表及其应用 一、实验目的: 1.掌握用C/C++语言调试程序的基本方法。 2.掌握线性表的基本运算,如插入、删除等。 二、实验内容: 1.编写一个程序,实现顺序表的各种基本运算,在此基础上完成如下功能: (1)初始化顺序表L。 (2)依次在顺序表L中插入元素a、b、c、e。 (3)输出顺序表L。 (4)输出顺序表L的长度。 (5)输出顺序表L的第3个元素。 (6)输出元素a的位置。 (7)在第4个元素之前插入元素f。 (8)输出顺序表L。 (9)删除第3个元素。 (10)输出顺序表L。 2.编写一个程序,实现以下功能,L1=(x1,x2,…,x n),L2=(y1,y2,…,y m),它们是两个线性表(L1和L2中的值都不重复),采用带头结点的单链表存储,设计一个算法合并L1和L2,结果存放在线性表L3中,要求如下: L3=(x1,y1,x2,y2,…,x m,y m,x m+1,…,x n) 当m n时 L3=(x1,y1,x2,y2,…,x n,y n,y n+1,…,y m) 当m>n时 L3仍采用单链表存储,算法的空间复杂度为O(1)。 (1)建立两个单链表L1和L2并输出。 (2)将合并L1和L2为L3。 (3)输出单链表L3。 三、实验要求: 1.完成程序设计并上机调试通过。 2.撰写实验报告,提供实验结果和数据。 3.写出算法设计小结和心得。 四、程序源代码: 五、程序运行情况(采用截图方式给出运行结果)

六、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等) 注:内容一律使用宋体五号字,单倍行间距

实验三实验报告

实验三实验报告 1、简易计算器 (1)问题描述 由键盘输入一算术表达式,以中缀形式输入,试编写程序将中缀表达式转换成一棵二叉表达式树,通过对该的后序遍历求出计算表达式的值。 (2)基本要求 a.要求对输入的表达式能判断出是否合法。不合法要有错误提示信息。 b.将中缀表达式转换成二叉表达式树。 c.后序遍历求出表达式的值 (3)数据结构与算法分析 一棵表达式树,它的树叶是操作数,如常量或变量名字,而其他的结点为操作符。 a.建立表达式树。二叉树的存储可以用顺序存储也可用链式存储。当要创建二叉树时,先从表达式尾部向前搜索,找到第一个优先级最低的运算符,建立以这个运算符为数据元素的根结点。注意到表达式中此运算符的左边部分对应的二叉绔为根结点的左子树,右边部分对应的是二叉绔为根结点的右子树,根据地这一点,可用递归调用自己来完成对左右子树的构造。 b.求表达式的值。求值时同样可以采用递归的思想,对表达式进行后序遍历。先递归调用自己计算左子树所代表的表达式的值,再递归调用自己计算右子树代表的表达式的值,最后读取根结点中的运算符,以刚才得到的左右子树的结果作为操作数加以计算,得到最终结果。 (4)需求分析 程序运行后显示提示信息,输入任意四则运算表达式,倘若所输入的表达式不合法程序将报错。 输入四则运算表达式完毕,程序将输出运算结果。 测试用的表达式须是由+、-、*、/运算符,括号“(”、“)”与相应的运算数组成。运算数可以是无符号浮点型或整型,范围在0~65535。 (5)概要设计 二叉树的抽象数据类型定义 ADT BinaryTree{ 数据对象:表达式运算数{ num | 0< num < 65535 } 表达式运算符{ opr | + , - , * , / } 数据关系:由一个根结点和两棵互不相交的左右子树构成,且树中结点具有层次关系。根结点必须为运算符,叶子结点必须为运算数。 基本操作: InitBiTree(&T , &S) 初始条件:存在一四则运算前缀表达式S。 操作结果:根据前缀表达式S构造相应的二叉树T。 DestroyBiTree(&T) 初始条件:二叉树T已经存在。 操作结果:销毁T。 Value(&T) 初始条件:二叉树T已经存在。 操作结果:计算出T所表示的四则运算表达式的值并返回。

相关文档
最新文档