栈的基本操作与应用
实验报告
课程名称数据结构实验名称栈的基本操作与应用
姓名王灵慧专业班级软工18104 学号 201817040409
试验日期 2019-11-06试验地点E3-502指导老师邹汉斌成绩
一、实验目的
1.熟悉并能实现栈的定义和基本操作。
2.了解和掌握栈在递归和非递归算法的应用。
二、实验要求
1.进行栈的基本操作时要注意栈“后进先出”的特性。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容
1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。
2.已知函数t(n)=2*t(n/2)+n 其中t(0)=0,n为整数。编写程序实现:
(1)计算t(n)的递归算法。
(2)分别用链式栈和顺序栈实现计算t(n)的非递归算法。
四、思考与提高
1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题?
五、实验步骤(每个实验内容包含代码、输入、输出、错误分析):
1、实验内容(1):
#include
#include
#include
#define true 1
#define null 0
#define ok 1
#define error 0
#define overflow -1
#define stack_init_size 100 #define stackincrement 10 using namespace std; typedef int selemtype; typedef int status;
typedef struct
{
selemtype *base;
selemtype *top;
int stacksize;
} sqstack;
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;
cout<<"已为您创造一个空栈"< return ok; } status gettop(sqstack s,selemtype &e) { if(s.top==s.base) 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,(s.stacksize+stackincrement)* 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.top==s.base)return error; e=*--s.top; return ok; } clearstack(sqstack &s) { s.top=s.base; cout< destroystack(sqstack &s) { int i,len; len=s.stacksize; for (i=0; i { free(s.base); s.base++; } cout<<"栈已经为您销毁"< } int main() { sqstack p; initstack(p); cout<<"请输入栈的长度"< int i; cin>>i; cout<<"请您依次输入"< for(int j=0; j { int w; cin>>w; push(p,w); } cout<<"现在为您依次出栈栈顶元素"< for(int j=0; j { int w,k; gettop(p,w); cout< pop(p,k); } clearstack(p); destroystack(p); } 2、实验内容(2): #include #include using namespace std; typedef struct node { int data; struct node *next; } Node; typedef struct { Node *top; Node *base; } Stack; int InitNode(Stack *p) { p->base=(Node *)malloc(sizeof(Node)); if(!p->base) return 0; p->top=p->base; p->top->data=0; p->top->next=NULL; return 1; } int Push(Stack *p,int e) { Node *p1; p1=(Node*)malloc(sizeof(Node)); if(p->base==p->top) { p1->data=e; p->top=p1; p1->next=NULL; } else { p1->data=e; p1->next=p->top; p->top=p1; } return 1; } int Pop(Stack *p,int e) { Node *p1; if(p->base==p->top) return 0; e=p->top->data; p1=p->top; p->top=p->top->next; free(p1); return 1; } int getTop(Stack *p,int e) { if(p->base==p->top) return 0; e=p->top->data; return e; } void print(Stack *p) { Node *p1; cout<<"栈内元素如 下:"< if(p->base==p->top) { cout<<"栈为空!!"< exit(0); } p1=p->top; while(p1!=NULL) { cout< p1=p1->next; } cout< } int Length(Stack *p) { int a=0; Node *p1; p1=p->top; while(p1!=NULL) { p1=p1->next; a++; } return a; } int getelem(Stack *p,int i) { Node *p1; int k=1,a=0; if(p->base==p->top) return 0; p1=p->top; while((p1!=NULL)&&(k { p1=p1->next; k++; } return p1->data; } int add(int x) { int a; if(x==0) a=0; else a=(2*add(x/2)+x); return a; } int main() { Stack p; int i,b=0,e=0,n,w=0,length=0; InitNode(&p); cout<<"请输入n,计算t(n):"< cin>>n; Push(&p,0); length=Length(&p); for(i=1; i<=n; i++) { e=2*getelem(&p,(length-(i/2)))+i; Push(&p,e); length=Length(&p); } b=getTop(&p,b); cout<<"用链栈得到的结果如下:"< cout<<"t("< cout<<"用顺序栈得到的结果如下:"< cout<<"t("< cout<<"用递归方法得到的结果如下:"< w=add(n); cout<<"t("< } return 0; 3、思考与提高 1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题? 让多个栈共用一个足够大的连续存储空间,利用栈的动态特性使它们的存储空间互补。 六、实验完成情况与总结 1、完成情况如下表(完成划勾、没完成打叉): 2、总结(自己对本部分知识的掌握情况以及存在的问题分析) 感觉自己对这些还是不够熟练,所以在打代码的时候还是要借助书籍,数据结构不得不说是一种对人的思维一种考验,希望自己能够认真的对待,一直想着成功出发。 (1)开始界面(2)初始化线性表 3.插入:下面是插入第一个元素的图(3),插入后再一次插入其他元素,最终插完元素,见图(4) (4)插入最后一个元素(第五个) 5.取栈顶元素,如图( (5)删除栈顶元素(6)取栈顶元素 6.置空顺序栈,如图(7) (7)置空顺序表 7. 数值转换(将一个十进制数转换为任意进制) 三进制数2220。 (9)回文数判断a (10)回文数判断b 实验结论:实验成功 八.我对本次实验的总结: 1.通过对该程序的调试和运行,使的对顺序栈的功能及其构成有了进一步的了解。 2.通过多个函数出现在同一个程序中的实现,便于熟悉全局变量和局部变量在程序中 可以重新熟悉函数在编程中的设置方法 void InitStack(SqStack *p) {if(!p) printf("内存分配失败!"); p->top =-1; } /*入栈*/ void Push(SqStack *p,ElemType x) {if(p->top 循环队链的出队 bool Dequeue( CSQueue &q, QElemType &e ) { int front; if( q.length == 0 ) return false; front = ( q.rear + 1 - q.length + MAXQSIZE ) % MAXQSIZE; e = q.elem[ front ]; q.length --; return true; } 循环队链的入队 bool Enqueue( CSQueue &q, QElemType e ) { if( q.length == MAXQSIZE ) return false; q.rear = ( q.rear + 1 ) % MAXQSIZE; q.elem[ q.rear ] = e; q.length ++; return true; } 链队的入队 void Enqueue( LQueue &q, QElemType e ) { LQueuePtr p; p = new QNode; p->data = e; p->next = q.rear->next; q.rear->next = p; q.rear = p; } 链队的出队 bool Dequeue( LQueue &q, QElemType &e ) { LQueuePtr p; if( q.rear->next == q.rear ) return false; p = q.rear->next; e = p->next->data; q.rear->next = p->next; delete p; return true; } 顺序栈的类型定义与基本操作: 实验报告 课程名称数据结构实验名称栈的基本操作与应用 姓名王灵慧专业班级软工18104 学号 201817040409 试验日期 2019-11-06试验地点E3-502指导老师邹汉斌成绩 一、实验目的 1.熟悉并能实现栈的定义和基本操作。 2.了解和掌握栈在递归和非递归算法的应用。 二、实验要求 1.进行栈的基本操作时要注意栈“后进先出”的特性。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。 2.已知函数t(n)=2*t(n/2)+n 其中t(0)=0,n为整数。编写程序实现: (1)计算t(n)的递归算法。 (2)分别用链式栈和顺序栈实现计算t(n)的非递归算法。 四、思考与提高 1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题? 五、实验步骤(每个实验内容包含代码、输入、输出、错误分析): 1、实验内容(1): #include 封面: 安徽大学 网络工程 栈和队列的基本操作的实现 ______2010\4\12 【实验目的】 1.理解并掌握栈和队列的逻辑结构和存储结构; 2.理解栈和队列的相关基本运算; 3.编程对相关算法进行验证。 【实验内容】 (一)分别在顺序和链式存储结构上实现栈的以下操作(含初始化,入栈,出栈,取栈顶元素等): 1.构造一个栈S,将构造好的栈输出; 2.在第1步所构造的栈S中将元素e 入栈,并将更新后的栈S输出; 3.在第2步更新后所得到的栈S中将栈顶元素出栈,用变量e返回该元素,并将更新后的栈S输出。(二)分别在链队列和循环队列上实现以下操作(初始化,入队,出队,取队头元素等): 1.构造一个队列Q,将构造好的队列输出; 2.在第1步所构造的队列Q中将元素e入队,并将更新后的队列Q输出; 3.在第2步更新后所得到的队列Q中将队头元素出队,用变量e返回该元素,并将更新后的队列Q输出。 【要求】 1.栈和队列中的元素要从终端输入; 2.具体的输入和输出格式不限; 3.算法要具有较好的健壮性,对运行过程中的错误 操作要做适当处理。 三、实验步骤 1.本实验用到的数据结构 (1)逻辑结构:线性结构 (2)存储结构:程序一、四(顺序存储结构); 程序二、三(链式存储结构); 2.各程序的功能和算法设计思想 程序一:顺序栈 # include 遼穿紳範大學上机实验报告 学院:计算机与信息技术学院 专 业 : 计算机科学与技术(师 范) 课程名称:数据结构 实验题目:顺序栈的基本操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号 一、实验目的: 1 ?熟悉掌握栈的定义、结构及性质; 2. 能够实现创建一个顺序栈,熟练实现入栈、出栈等栈的基本操作; 3?了解和掌握栈的应用。 二、实验环境: Microsoft Visual C++ 6.0 三、实验内容及要求: 栈是一种特殊的线性表,逻辑结构和线性表相同,只是其运算规则有更多的限制,故又称为受限的线性表。 建立顺序栈,实现如下功能: 1. 建立一个顺序栈 2. 输出栈 3. 进栈 4. 退栈 5. 取栈顶元素 6. 清空栈 7. 判断栈是否为空 进行栈的基本操作时要注意栈”后进先出”的特性。 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序栈。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作 五、代码: #include 实验三栈和队列 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 北京理工大学珠海学院实验报告 ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 班级软件工程3班学号 150202102309姓名郭荣栋 指导教师余俊杰成绩 实验题目栈的实现与应用实验时间 一、实验目的、意义 (1)理解栈的特点,掌握栈的定义和基本操作。 (2)掌握进栈、出栈、清空栈运算的实现方法。 (3)熟练掌握顺序栈的操作及应用。 二、实验内容及要求 1.定义顺序栈,完成栈的基本操作:建空栈、入栈、出栈、取栈顶元素(参见教材45页)。 2. 调用栈的基本操作,将输入的十进制数转换成十六进制数。 3. 调用栈的基本操作,实现表达式求值,如输入3*(7-2)#,得到结果15。 三、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。) 四、程序清单(包含注释) 1、2. #include 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); } 第五次实验报告—— 顺序栈、链栈的插入和删除一需求分析 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={ Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 2、链栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={ 栈的顺序表示和实现 2.2基础实验 2.2.1实验目的 (1)掌握栈的顺序表示和实现 (2)掌握栈的链式表示和实现 (3)掌握队列的顺序表示和实现 (4)掌握队列的链式表示和实现 2.2.2实验内容 实验一:栈的顺序表示和实现 【实验内容与要求】 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2 )插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍历顺序栈 (6)置空顺序栈 【知识要点】 栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。 对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p->top= =MAXNUM-1 ,栈满时,不能入栈;否则岀现空间溢岀,引起错误,这种现象称为上溢。 岀栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。 注意: (1)顺序栈中元素用向量存放 (2)栈底位置是固定不变的,可设置在向量两端的任意一个端点 (3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top (通常称top为栈顶指针)来指示当前栈顶位置 【实现提示】 /*定义顺序栈的存储结构*/ typedef struct { ElemType stack[MAXNUM]; int top; }SqStack; /*初始化顺序栈函数*/ void lnitStack(SqStack *p) {q=(SqStack*)malloc(sizeof(SqStack)/* 申请空间*/) /*入栈函数*/ void Push(SqStack *p,ElemType x) {if(p->top #include 实验二栈和队列的基本操作实现及其应用 一_一、实验目的 1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。 一_二、实验内容 题目一、试写一个算法,判断依次读入的一个以@为结束符的字符序列,是否为回文。所谓“回文“是指正向读和反向读都一样的一字符串,如“321123”或“ableelba”。 相关常量及结构定义: #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int SElemType; typedef struct SqStack { SElemType *base; SElemType *top; int stacksize; }SqStack; 设计相关函数声明: 判断函数:int IsReverse() 栈:int InitStack(SqStack &S ) int Push(SqStack &S, SElemType e ) int Pop(SqStack &S,SElemType &e) int StackEmpty(s) 一_三、数据结构与核心算法的设计描述 1、初始化栈 /* 函数功能:对栈进行初始化。参数:栈(SqStack S)。 成功初始化返回0,否则返回-1 */ int InitStack(SqStack &S) { S.base=(SElemType *)malloc(10*sizeof(SElemType)); if(!S.base) //判断有无申请到空间 return -1; //没有申请到内存,参数失败返回-1 S.top=S.base; S.stacksize=STACK_INIT_SIZE; S.base=new SElemType; return 0; } 2、判断栈是否是空 /*函数功能:判断栈是否为空。参数; 栈(SqStack S)。栈为空时返回-1,不为空返回0*/ int StackEmpty(SqStack S) { if(S.top==S.base) return -1; else return 0; } 3、入栈 /*函数功能:向栈中插入元素。参数; 栈(SqStack S),元素(SElemtype e)。成功插入返回0,否则返回-1 */ int Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType *)realloc(S.base,(S.stacksize+1) * sizeof(SElemType)); 数据结构实验三 课程数据结构实验名称顺序栈基本操作第页 专业班级学号 姓名 实验日期:年月日评分 一、实验目的 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 #include 实验三栈的基本操作及应用 实验时间:第7周 实验目的:掌握栈的初始化、判空、出栈、入栈等基本操作 实验要求: 1.认真阅读和掌握教材上和本实验相关的算法。 2.上机将相关算法实现。 3.实现下面实验内容要求的功能,并输出程序的运行结果,结合程序进行分析。 实验内容: 利用栈的基本操作编程实现将任意一个十进制整数N转换为d进制整数。 算法提示: 1、定义栈的顺序存取结构(也可以用链栈) 2、分别定义栈的基本操作(初始化栈、判空、出栈、入栈等) 3、定义一个函数用来实现数制转换问题: 十进制整数N和d作为形参 初始化栈 只要N不为0重复做下列动作 将N%d入栈 N = N/d 只要栈不为空重复做下列动作 栈顶元素出栈 输出栈顶元素 注意:如果你完成上述任务还有时间,仔细分析、单步调试下面程序。目的有两个:一是消化、分析C++中的引用;二是练习使用VC中的调试器。 #include { a=8; } void main() { int x=1; //int &y=x; fun(x); //x=4; cout << x < 栈的类型定义与基本操 作 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】 循环队链的出队 bool Dequeue( CSQueue &q, QElemType &e ) { int front; if( == 0 ) return false; front = ( + 1 - + MAXQSIZE ) % MAXQSIZE; e = [ front ]; --; return true; } 循环队链的入队 bool Enqueue( CSQueue &q, QElemType e ) { if( == MAXQSIZE ) return false; = ( + 1 ) % MAXQSIZE; [ ] = e; ++; return true; } 链队的入队 void Enqueue( LQueue &q, QElemType e ) { LQueuePtr p; p = new QNode; p->data = e; p->next = >next; >next = p; = p; } 链队的出队 bool Dequeue( LQueue &q, QElemType &e ) { LQueuePtr p; if( >next == ) return false; p = >next; e = p->next->data; >next = p->next; delete p; return true; } 顺序栈的类型定义与基本操作: const StackInitSize=100; const StackInc=10; struct SStack { SElemType *base,*top; isited=false; for(i=1;i<=;i++) if(![i].visited) { visit[i].data); [i].visited=true; Enqueue(q,i); while(Dequeue(q,j)) for(p=[j].firstarc;p;p=p->nextarc) { k=p->adjvex; if(![k].visited) { visit(G>Vexs[k].data); [k].visited=true; Enqueue; } } } } 深度优先搜索遍历 void DFS(ALGraph &G, int i, void visit(VexType)) { int j; Arcptr p; visit[i].data); [i].visited=true; for(p=[i].firstarc ;p; p=p->nextarc) { J=p->adjvex; if(![j].visited) DFS(G,j,visit); } } 栈的类型定义与基本 操作 Revised on November 25, 2020 循环队链的出队 bool Dequeue( CSQueue &q, QElemType &e ) { int front; if( == 0 ) return false; front = ( + 1 - + MAXQSIZE ) % MAXQSIZE; e = [ front ]; --; return true; } 循环队链的入队 bool Enqueue( CSQueue &q, QElemType e ) { if( == MAXQSIZE ) return false; = ( + 1 ) % MAXQSIZE; [ ] = e; ++; return true; } 链队的入队 void Enqueue( LQueue &q, QElemType e ) { LQueuePtr p; p = new QNode; p->data = e; p->next = >next; >next = p; = p; } 链队的出队 bool Dequeue( LQueue &q, QElemType &e ) { LQueuePtr p; if( >next == ) return false; p = >next; e = p->next->data; >next = p->next; delete p; return true; } 顺序栈的类型定义与基本操作: const StackInitSize=100; const StackInc=10; struct SStack { SElemType *base,*top; isited=false; for(i=1;i<=;i++) if(![i].visited) { visit[i].data); [i].visited=true; Enqueue(q,i); while(Dequeue(q,j)) for(p=[j].firstarc;p;p=p->nextarc) { k=p->adjvex; if(![k].visited) { visit(G>Vexs[k].data); [k].visited=true; Enqueue; } } } } 深度优先搜索遍历 void DFS(ALGraph &G, int i, void visit(VexType)) { int j; Arcptr p; visit[i].data); [i].visited=true; for(p=[i].firstarc ;p; p=p->nextarc) { J=p->adjvex; if(![j].visited) DFS(G,j,visit); } } 实验四链栈 一、实验目的 1、掌握用VC工具上机调试链栈的基本方法; 2、掌握链栈的基本操作,链栈初始化、链栈入栈、链栈出栈、判断链栈是否为空、 求队列长度以及链栈销毁操作; 3、掌握栈在链式映像下的操作实现。 二、实验学时 2学时 三、实验类型 验证型 四、实验内容 1、链栈的初始化、链栈入栈、链栈出栈、判断链栈是否为空、求链栈长度、链栈输 出及链栈销毁操作的实现; 2、通过设计统一界面来调用链栈的基本操作的实现。 五、实验原理 1、链栈概述 链栈是栈这一受限的线性表的链式映像实现。为方便操作,链栈采用带头结点的单链表存储结构,若链栈为空则栈头结点指针域为空;若链栈非空则栈头结点指向链栈的第一个元素,操作是可将其赋值给工作指针进行相应的各种操作即可。 2、链栈基本算法 (1)LinkStackInitiate(S);初始化链栈S。 (2)LinkStackEmpty(S);判断链栈S非空否操作。 (3)EnLinkStack (S,x);链栈S入栈操作,在链栈S的栈顶插入数据元素x。 (4)DeLinkStack (S,d);链栈S出栈操作,把链栈S的栈顶元素删除并由参数d带回。 (5)LenLinkStack (S);求链栈S长度。 (6)DisLinkStack (S);输出链栈S。 (7)DestroyLinkStack(S);销毁链栈S。 3、模块层次 要求画出链栈的模块层次图。如图所示 图7 链栈的模块层次图 4、关键算法NS图 六、实验步骤及要求 用VC语言编程实现建立一个链栈,并在此链栈中入栈若干个元素和出栈若干个元素 1.链栈初始化; 2.通过键盘读取元素建立链栈S; 实验名称栈的基本操作 实验目的 掌握栈这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作: (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班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号 一、实验目的: 1.熟悉掌握栈的定义、结构及性质; 2.能够实现创建一个顺序栈,熟练实现入栈、出栈等栈的基本操作; 3.了解和掌握栈的应用。 二、实验环境: Microsoft Visual c++ 6.0 三、实验内容及要求: 栈是一种特殊的线性表,逻辑结构和线性表相同,只是其运算规则有更多的限制,故又称为受限的线性表。 建立顺序栈,实现如下功能: 1.建立一个顺序栈 2.输出栈 3.进栈 4.退栈 5.取栈顶元素 6.清空栈 7.判断栈是否为空 进行栈的基本操作时要注意栈"后进先出"的特性。 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序栈。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作 五、代码: #include栈的顺序表示和实现
栈的类型定义与基本操作
栈的基本操作与应用
栈和队列的基本操作的实现
顺序栈的基本操作讲解
栈的操作(实验报告)
数据结构栈的定义及基本操作介绍
数据结构栈的基本操作,进栈,出栈
用顺序结构表示栈并实现栈地各种基本操作
栈的基本操作c语言
栈和队列的基本操作实现及其应用
(完整word版)顺序栈基本操作实验报告
数据结构——顺序栈的基本操作
实验三 栈的基本操作及应用
栈的类型定义与基本操作
栈的类型定义与基本操作
链栈实验
数据结构(C语言)栈的基本操作
顺序栈的基本操作