数据结构-实验3 栈和队列

时间:2024.4.20


验(实训)报

          实验3 栈和队列         

所属课程名称                     

                            

实验(实训)日期          2013.10.               

                                  

                                  

                                  

指导教师                         

浙江财经学院教务处制


一、实验(实训)概述:

【实验目的】

1.    掌握栈的两种存储实现方法:顺序栈和链式栈;掌握STL栈的使用方法,能用栈求解问题。

2.    掌握队列的两种存储实现方法:顺序队列和链式队列;掌握STL队列的使用方法,能用队列求解问题。

【实验要求】

1.    新建文件夹,并命名为“学号姓名实验1 数据结构概论”,如“0901042001** ×××实验1 数据结构概论”(**和×××部分用自己的学号和姓名替换),该文件夹用于存放实验程序和实验报告。实验报告完成后,请将该文件夹压缩后提交,压缩前请删除各程序的debug目录。

2.    认真记录实验过程及结果,认真回答实验报告中的问题。

3.    及时提交实验报告。

【实施环境】(使用的材料、设备、软件)

Visual C++ 6.0

注意:所有回答的内容用红色字体标明!!!

二、实验(实训)内容:

实验任务一 

1回答以下问题

(1) 在日常生活中,除课件中提到的例子(超市存放购物车的轨道、折反型的火车站)外,还有哪些事物“处理数据”的方式是按照栈的方式进行的。

回答:

(2) 请根据你的理解,回答在什么情况下可以用栈来存储数据?

回答:

(3) 栈具有后进先出(LIFO)的特性,是因为它使用的存储结构具有这样的特性吗?还是因为其他原因?原因又是什么?

回答:

2栈的应用-计算表达式的值

(1) 请将下列中缀表达式转换成等值的后缀表达式。

(2+3)×(19-7) + (6 – 9) – 66/3

75 – 23 + (19 – 11)/(5 – 1) – 15

回答:

(2) 求解(1)中得到的后缀表达式,要求将求解过程列出来。

回答:

3顺序栈

请写出顺序栈的实现的主要代码,分别粘贴在下方。

回答:

4链式栈

请写出链式栈的实现的主要代码,分别粘贴在下方。

回答:

5掌握STLstack的使用。

(1) 请写出阶乘函数的递归实现。(主要代码粘贴在下方)

回答:

(2) 请写出阶乘函数的迭代实现。(主要代码粘贴在下方)

回答:

(2) 请写出阶乘函数的非递归实现,要求使用STLstack,及其成员函数(主要代码粘贴在下方)

回答:

6掌握STLstack的使用。

请编写一个程序,测试STLstack的使用,要求用到stack的成员函数。

编写一个代码段,弹出栈中所有结点,用STL中的栈实现。

stack<int> S;//假设栈里已经有结点了

请将代码粘贴在下方。

回答:

实验任务二队列

1回答以下问题

(1) 请根据你的理解,回答在什么情况下可以用队列来存储数据?

回答:

(2) 本章介绍了四种线性表,分别是顺序表、单链表、栈和队列,请总结这四种线性表的特点(包括优缺点、适用范围)。

回答:

2顺序队列

请写出顺序队列的实现的主要代码,分别粘贴在下方。

回答:

3链式队列

请写出链式队列的实现的主要代码,分别粘贴在下方。

回答:

4掌握STL队列queue的使用。

请用STL的优先级队列模拟Windows操作系统的消息队列。每个消息用一个字符串表示,为“Keyboard”、“Mouse”、“Timer”,分别表示键盘(注意有不同的键盘消息,所以不同的Keyboard消息优先级允许不一样)、鼠标和定时器消息。每个消息有自己的优先级,用整数表示,该值越大表示优先级越高。

输入描述:首先是一个整数n,表示要处理消息的数目,接下来有2n行,每行可能为一个消息(格式为“消息名称优先级”),也可能为“Process”,后者表示处理一个消息(总是处理当前优先级高的消息)。输入数据保证不会出现“在要处理消息时,优先级队列为空”的情形,也能保证在同一时刻,优先级队列中不存在两个优先级相同的消息。

输出描述:输出依次处理的每个消息,格式如样例输出所示。

样例输入/输出如下。

请将代码粘贴在下方。

回答:


第二篇:《数据结构》实验二 栈和队列


《数据结构》实验指导及报告书

    2014     /    2015    学年  第   1学期

姓    名:

学    号:

班    级:

指导教师:徐江

计算机科学与工程学院

20##

实验二 栈和队列

一、实验目的

1、掌握栈的结构特性及其入栈,出栈操作;

2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。

二、实验内容和要求

1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。

#include<stdio.h>

#include<malloc.h>

#define ERROR 0

#define OK 1

#define STACK_INT_SIZE 10  /*存储空间初始分配量*/

#define STACKINCREMENT 5  /*存储空间分配增量*/

typedef  int ElemType; /*定义元素的类型*/

typedef struct{

    ElemType *base;

    ElemType *top;

    int stacksize;     /*当前已分配的存储空间*/

}SqStack;

int InitStack(SqStack *S);   /*构造空栈*/

int push(SqStack *S,ElemType *e); /*入栈*/

int Pop(SqStack *S,ElemType *e);  /*出栈*/

int CreateStack(SqStack *S);     /*创建栈*/

void PrintStack(SqStack *S);   /*出栈并输出栈中元素*/

int InitStack(SqStack *S){

    S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType));

    if(!S->base) return ERROR;

    S->top=S->base;

    S->stacksize=STACK_INT_SIZE;

    return OK;

}/*InitStack*/

int Push(SqStack *S,ElemType e){

   

}/*Push*/

int Pop(SqStack *S,ElemType *e){

  

}/*Pop*/

int CreateStack(SqStack *S){

    int e;

    if(InitStack(S))

        printf("Init Success!\n");

    else{

        printf("Init Fail!\n");

        return ERROR;

    }

    printf("input data:(Terminated by inputing a character)\n");

    while(scanf("%d",&e))

        Push(S,e);

    return OK;

}/*CreateStack*/

void PrintStack(SqStack *S){

    ElemType e;

    while(Pop(S,&e))

        printf("%3d",e);

}/*Pop_and_Print*/

int main(){

    SqStack ss;

    printf("\n1-createStack\n");

    CreateStack(&ss);

    printf("\n2-Pop&Print\n");

    PrintStack(&ss);

    return 0;

}     

l   算法分析:输入元素序列1 2 3 4 5,为什么输出序列为5 4 3 2 1?体现了栈的什么特性?

#include<stdio.h>

#include<malloc.h>

#define ERROR 0

#define OK 1

#define STACK_INT_SIZE 10  /*存储空间初始分配量*/

#define STACKINCREMENT 5  /*存储空间分配增量*/

typedef  int ElemType; /*定义元素的类型*/

typedef struct{

    ElemType *base;

    ElemType *top;

    int stacksize;     /*当前已分配的存储空间*/

}SqStack;

int InitStack(SqStack *S);   /*构造空栈*/

int Push(SqStack *S,ElemType *e); /*入栈*/

int Pop(SqStack *S,ElemType *e);  /*出栈*/

int CreateStack(SqStack *S);     /*创建栈*/

void PrintStack(SqStack *S);   /*出栈并输出栈中元素*/

int InitStack(SqStack *S){

    S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType));

    if(!S->base) return ERROR;

    S->top=S->base;

    S->stacksize=STACK_INT_SIZE;

    return OK;

}/*InitStack*/

int Push(SqStack *S,ElemType e){

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

    {

        S->base=(ElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));

        if(!S->base) return ERROR;

        S->top=S->base+S->stacksize;

        S->stacksize+=STACKINCREMENT;

    }

    *S->top++=e;

    return OK;

}/*Push*/

int Pop(SqStack *S,ElemType *e){

   if(S->top=S->base)return ERROR;

   e= --S->top;

   return OK;

}/*Pop*/

int CreateStack(SqStack *S){

    int e;

    if(InitStack(S))

        printf("Init Success!\n");

    else{

        printf("Init Fail!\n");

        return ERROR;

    }

    printf("input data:(Terminated by inputing a character)\n");

    while(scanf("%d",&e))

        Push(S,e);

    return OK;

}/*CreateStack*/

void PrintStack(SqStack *S){

    ElemType e;

    while(Pop(S,&e))

        printf("%3d",e);

}/*Pop_and_Print*/

int main(){

    SqStack ss;

    printf("\n1-createStack\n");

    CreateStack(&ss);

    printf("\n2-Pop&Print\n");

    Pop(&ss, &e);

    PrintStack(&ss);

    return 0;

}

2、在第1题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。

l   实现代码

#include<stdio.h>

#include<malloc.h>

#define ERROR 0

#define OK 1

#define STACK_INIT_SIZE 10  /*存ä?储ä¡é空?间?初?始º?分¤?配?量¢?*/

#define STACKINCREMENT 5  /*存ä?储ä¡é空?间?分¤?配?增?量¢?*/

typedef  int SElemType; /*定¡§义°?元a素?的Ì?类¤¨¤型¨ª*/

typedef struct

{

    SElemType *base;

    SElemType *top;

    int stacksize;

}SqStack;

int InitStack(SqStack &S);

int CreateStack(SqStack *S);

int GetTop(SqStack S,SElemType &e);

int Push(SqStack &S,SElemType e);

int Pop(SqStack &S,SElemType &e);

void conversion();

void main()

{  

    int e;

    SqStack S;

    CreateStack(S);

    GetTop( S, e);

    Push( S, e);

    conversion();

}

int InitStack(SqStack &S)

{

    S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));

    if(!S.base)return ERROR;

    S.top=S.base;

    S.stacksize=STACK_INIT_SIZE;

}

int CreateStack(SqStack &S)

{

    int e;

    if(InitStack(S))

        printf("Init Success!\n");

    else{

        printf("Init Fail!\n");

        return ERROR;

    }

    printf("input data:(Terminated by inputing a character)\n");

    while(scanf("%d",&e))

        Push(S,e);

    return OK;

}

int GetTop(SqStack S,SElemType &e)

{

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

    e=*(S.top-1);

    return OK;

}

int Push(SqStack &S,SElemType e)

{

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

    {

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

        if(!S.base)return ERROR;

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

        S.stacksize+=STACKINCREMENT;

    }

}

 int Pop(SqStack &S,SElemType &e)

{

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

   e= *--S.top;

   return OK;

 }

void conversion()

{

    int n,e;

    SqStack S;

    printf("input data:\n");

    scanf("%d",n);

    while(n)

    {

        Push(S,n);

        n=n/2;

    }

   

        Pop(S,e);

        printf("%d",e);

}

3、阅读并运行程序,并分析程序功能。

#include<stdio.h>

#include<malloc.h>

#include<string.h>

#define M 20

#define  elemtype  char

typedef struct

{

    elemtype stack[M];

    int top;

}

stacknode;

void init(stacknode *st);

void push(stacknode *st,elemtype x);

void pop(stacknode *st);

void init(stacknode *st)

{

    st->top=0;

}

void push(stacknode *st,elemtype x)

{

    if(st->top==M)

        printf("the stack is overflow!\n");

    else

    {

        st->top=st->top+1;

        st->stack[st->top]=x;

    }

}

void pop(stacknode *st)

{

    st->top=st->top-1;

}

int main()

{

    char s[M];

    int i;

    printf("create a empty stack!\n");

    stacknode *sp;

    sp=malloc(sizeof(stacknode));

    init(sp);

    printf("input a expression:\n");

    gets(s);

    for(i=0;i<strlen(s);i++)

    {

        if(s[i]=='(')

            push(sp,s[i]);

        if(s[i]==')')

            pop(sp);

    }

    if(sp->top==0)

        printf("'('match')'!\n");

    else

        printf("'('not match')'!\n");

    return 0;

}

l   输入:2+((c-d)*6-(f-7)*a)/6

l   运行结果:

l   输入:a-((c-d)*6-(s/3-x)/2

l   运行结果:

l   程序的基本功能:

以下为选做实验:

4、设计算法,将一个表达式转换为后缀表达式,并按照后缀表达式进行计算,得出表达式得结果。

l   实现代码

5、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点(不设队头指针),试编写相应的置空队列、入队列、出队列的算法。

实现代码:

三、实验小结

四、教师评语

更多相关推荐:
数据结构试验心得

数据结构课程设计心得体会(专业:计算机科学与技术姓名:朱文学号:20xx220xx7)通讯录管理系统是基于双向循环链表设计而成的信息管理系统。该系统通过对程序进行模块化,建立添加、显示、查找和删除功能的函数,各…

数据结构实训总结

这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。…

数据结构实验报告及心得体会

20XX~20XX第一学期数据结构实验报告班级:信管一班学号:*********姓名:***实验报告题目及要求一、实验题目设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。1…

数据结构与算法实验学期总结

20xx20xx学年第2学期数据结构与算法实验学期论文数据结构与算法实验学期总结我的数据结构班级09计本一班学号20xx810020姓名吴伟摘要数据结构实验的目的是为了加深对课堂知识的理解培养实验者的动手能力和...

数据结构实验报告

管理学院实验报告实验课程名称数据结构与算法实验地点经济管理教学实验中心年月至年月专业班级学生姓名学号指导老师13456789101112141516

数据结构综合实验心得体会

心得体会:做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅。对大一学习的C语言和这学期开的数据结构,并没有掌握,很多知识都不太懂,突然让自己独立完成一个程序让我手忙脚乱,起码在我认为那真的…

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

数据结构实验报告目的要求掌握图的存储思想及其存储实现掌握图的深度广度优先遍历算法思想及其程序实现掌握图的常见应用算法的思想及其程序实现实验内容键盘输入数据建立一个有向图的邻接表输出该邻接表3在有向图的邻接表的基...

数据结构实验报告

数据结构实验报告学号1410122583姓名王佳斌诚信声明签字实验一实验题目数据集合的表示及运算实验目的构造一个非递减数列然后在该数列中新加入一个数并保持该数列非递减有序性的特征用一维数组存储数列实验中遇到的问...

数据结构实验报告

实验报告课程数学号姓名据结构实验日期20xx114实验指导老师胡青实验1链表的插入和删除一实验目的1了解单链表循环链表和双链表的基本知识2掌握算法思想和数据结构的描述3掌握链表的插入删除的相关语句及基本方法二实...

数据结构实验报告

实验报告一约瑟夫环问题1问题描述设编号为12nngt0个人按顺时针方向围坐一圈每人持有一个正整数密码开始时任意给出一个报数上限m从第一个人开始顺时针方向自1起顺序报数报到m时停止报数报m的人出列将他的密码作为新...

数据结构实验报告七

云南大学软件学院数据结构实验报告本实验项目方案受教育部人才培养模式创新实验区X3108005项目资助实验难度ABC学期20xx秋季学期任课教师秦江龙实验题目哈希表查找小组长联系电话147xxxxxxxx电子邮件...

数据结构实验报告一

数据结构实验报告实验题目班级学号姓名完成日期一需求分析1问题描述ProblemDescription给定两个不超过10000位的非负整数A和B计算出AB的值要求计算并输出AB的值2根据实验任务的要求分析大整数要...

数据结构实验总结(44篇)