实验三--顺序栈操作实现
实验三--顺序栈操作实现
实验三顺序栈操作实现
实验日期:2017 年 4 月 1 日
实验目的及要求
1. 熟练掌握栈的结构,以及这种数据结构的特点;
2. 能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法。
实验内容
已知顺序栈的类型定义如下:
#define MAX 100
typedef char datatype;
typedef struct{
datatype data[MAX];
int top;
}SeqStack, *SeqStackptr;
任务
1.题目要求
任务一:
创建自定义头文件seqStack.h,包含顺序栈的数据类型定义及基本操作函数,需定义的基本操作如下:
(1)void Error(char *s);/*自定义错误处理函数*/
(2)void InitStack (SeqStackptr sp);/*初始化栈——置空栈*/
(3)int EmptyStack (SeqStackptr sp);/*判栈空*/
(4)int FullStack (SeqStackptr sp);/*判栈满*/
(5)void Push (SeqStackptr sp, datatype x);/*进栈(元素压入栈顶)*/ (6)datatype Pop (SeqStackptr sp);/*出栈(元素从栈顶弹出)*/
(7)datatype GetTop (SeqStackptr sp);/*读栈顶元素(不出栈)*/
(8)int Count (SeqStackptr sp);/*计算栈中元素个数*/
任务二:
创建一个新的程序文件sy13.cpp,请调用seqStack.h提供的顺序栈操作的函数完成把源文本文件中的所有十进制数转换成相应的指定进制的数值存于新的文本文件中,要求定义如下函数:
(1)void Trans(int n, int r, char str[])
功能:把n整数转换为r进制的值并存于str数组中;
(2)void TransFile(int r,char strin[],char strout[]);
功能:把strin文件中十进制整数转换为r进制的值并存于文件strout中。其中strin和strout字符数组中分别存放源文件名和目标文件名。
(思路:1. 以只读方式打开strin中的文件,以只写方式打开存于strout 中的文件
2. 循环读取strin文件
(1)读一个整数到变量num中
(2)调用Trans函数将num转换为r进制的字符串result
(3)将字符串result写入到文件strout中
3. 关闭strin文件,strout文件。)
(3)main函数中准备指定进制r的值,源文件名和目标文件名,调用TransFile 函数完成相应要求。
2.请回答下列问题
(1)栈是限定在表的一端进行插入或删除操作的线性表,其操作原则是后进先出。
(2)一个不带表头结点链栈的栈顶指针是top,每个结点包含值域data和指针域next,判断栈空的条件为top==NULL ,当p所指向的结点入栈,首先执行判断栈是否满,然后执行p->data[p->top++]=x 操作。
(3)设数组S[100]存储一个顺序栈的元素,变量top指示下一个入栈元素在数组中的下标位置,栈为空的条件是top-1==NULL ,栈为满的条件是top>=100 。
3.seqStack.h及sy13.cpp源程序清单(含必要的注释)
SeqStack.h:
#include
#include
#define MAX 100
typedef char datatype;
typedef struct {
datatype data[MAX];
int top;
}SeqStack, *SeqStackptr;
SeqStack s;
SeqStackptr sp;
void Error(char *s); /*自定义错误处理函数*/
void InitStack(SeqStackptr sp); /*初始化栈——置空栈*/
int EmptyStack(SeqStackptr sp); /*判栈空*/
int FullStack(SeqStackptr sp); /*判栈满*/
void Push(SeqStackptr sp, datatype x); /*进栈(元素压入栈顶)*/ datatype Pop(SeqStackptr sp); /*出栈(元素从栈顶弹出)*/
datatype GetTop(SeqStackptr sp); /*读栈顶元素(不出栈)*/
int Count(SeqStackptr sp); /*计算栈中元素个数*/
void Error(char *s) /*自定义错误处理函数*/
{
printf("\n %s", s);
exit(1); /*返回OS,该函数定义在stdlib.h中*/
}
void InitStack(SeqStackptr sp) /*初始化栈——置空栈*/
{
sp->top = 0;
}
int EmptyStack(SeqStackptr sp) /*判栈空*/
{
return sp->top == 0; /*返回值为1,栈空;返回值为0,栈不空*/ }
int FullStack(SeqStackptr sp) /*判栈满*/
{
return sp->top >= MAX; /*返回值为1,栈满;返回值为0,栈不满*/ }
void Push(SeqStackptr sp, datatype x) /*进栈(元素压入栈顶)*/
{
if (FullStack(sp)) { /*若栈满*/
Error("Stack Full");
}
sp->data[sp->top] = x;
sp->top++;
}
datatype Pop(SeqStackptr sp) /*出栈(元素从栈顶弹出)*/
{
if (EmptyStack(sp)) { /*若栈空*/
Error("Stack Empty");
}
sp->top--;
return sp->data[sp->top];
}
datatype GetTop(SeqStackptr sp) /*读栈顶元素(不出栈)*/
{
if (EmptyStack(sp)) { /*若栈空*/
Error("Stack Empty");
}
return sp->data[sp->top - 1];
}
int Count(SeqStackptr sp) /*计算栈中元素个数*/
{
return sp->top;
}
sy13.cpp:
#include"seqStack.h"
void Trans(int n, int r, char str[]); /*把n整数转换为r进制的值并存于str数组中*/
void TransFile(int r, char strin[], char strout[]); /*把strin文件中十进制整数转换为r进制的值并存于文件strout中。其中strin和strout字符数组中分别存放源文件名和目标文件名*/
void main() {
int r;
char s[MAX], t[MAX];
printf("请输入进制r的值:");
scanf("%d", &r);
TransFile(r, s, t);
}
void Trans(int n, int r, char str[]) { /*把n整数转换为r进制的值并存于str 数组中*/
int i, c;
SeqStack s;
InitStack(&s);
do {
c = n%r;
if (c < 10) {
c = c + '0';
}
else {
c = c - 10 + 'a';
}
Push(&s, c);
} while (n /= r);
i = 0;
while (!EmptyStack(&s)) {
str[i++] = Pop(&s);
}
str[i] = '\0';
}
void TransFile(int r, char strin[], char strout[]) { /*把strin文件中十进制整数转换为r进制的值并存于文件strout中。其中strin和strout字符数组中分别存放源文件名和目标文件名*/
int num, i, n;
char result[MAX];
FILE *fin;
FILE *fout;
if ((fin = fopen("D:/strin.txt", "r")) == NULL) {
Error("Can not open file!");
}
if ((fout = fopen("D:/strout.txt", "w")) == NULL) {
Error("Can not open file!");
}
fprintf(fout, "源数据转化为%d进制后为:\n", r);
while (!feof(fin)) {
fscanf(fin, "%d", &num);
Trans(num, r, result);
fprintf(fout, "%s ", result);
}
fclose(fin);
fclose(fout);
}
4.源文本文件的内容,程序执行后目标数据文件的内容
实验总结分析(本程序的重点与难点,调试中出现的问题及解决方法等)
栈的顺序表示和实现
(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
顺序栈的基本操作讲解
遼穿紳範大學上机实验报告 学院:计算机与信息技术学院 专 业 : 计算机科学与技术(师 范) 课程名称:数据结构 实验题目:顺序栈的基本操作 班级序号:师范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.掌握栈的定义。 2.掌握栈基本操作的实现,并能用于解决实际问题。 实验环境(硬/软件要求): Windows 2000, Visual C++ 6.0 实验内容: 1.实现栈的如下基本操作:push,pop,isempty,isfull,createstack. 2.利用栈的基本操作实现conversion()函数,该函数能将任意输出的十进制整数转化为二进制形式表示。 实验要求: 1.用顺序存储结构实现栈的基本操作:push,pop,isempty,isfull,createstack. 2.利用栈的基本操作实现conversion()函数 3.编写主函数完成实验内容2. 【C语言源程序】 #include
数据结构栈的基本操作,进栈,出栈
第五次实验报告—— 顺序栈、链栈的插入和删除一需求分析 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
栈的基本操作c语言
#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));
(完整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
栈实验报告
北京建筑大学 理学院《数据结构与算法》课程实验报告 课程名称《数据结构与算法》实验名称栈的创建以及应用实验地点基C-419 日期_2015-4-25 姓名李若万班级信131 学号201307010135 指导教师毕靖成绩 【实验目的】 1.熟悉并写出栈的逻辑结构表示 2.实现栈的存储表示 3.实现线性表的操作 【实验内容】 1.括号匹配 【实验要求】 1.要求:在实验报告中写出栈的ADT表示; 2.在实验报告中给出数据类型定义和核心算法和程序; 3.在实验报告中罗列实验过程中出现的问题和解决的方法; 4.打包上交调试后的完整程序,提交实验报告; 5.实验之前写出实验报告的大概框架,实验过程中填写完整。 6.实验时携带需要上机调试的程序; 7.实验评分:实验之前预习占20%,实验报告书写情况占50%,运行情况30%。 【实验步骤】 实验中出现的问题以及解决方法: 1、代码里面用到getch()报错,后来在前面提前声明头文件#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):栈 #include if(p==NULL) { printf("There is no bumber\n"); return; } printf("The remaining numbers are:\n"); while(p!=NULL) { printf("%4d",p->data); p=p->next; } } int pops(node_type **top) { node_type *p; int x; if((*top)==NULL) { printf("error\n"); return 0; } else { x=(*top)->data; printf("\n%d\n",x); p=(*top); (*top)=(*top)->next; return(x); free(p); } } void main() { node_type *h=NULL; pushs(&h); printlst(&h); printf("\nPop a number\n"); pops(&h); printlst(&h); printf("\nPop a number\n"); pops(&h); printlst(&h); } (2):队列 实验名称栈的基本操作 实验目的 掌握栈这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作: (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,返回;实验三 栈的基本操作及应用
栈的类型定义与基本操作
栈的类型定义与基本操作
栈和队列实验报告
数据结构(C语言)栈的基本操作