栈与队列数据结构实验
《数据结构》实验报告
苏州科技学院
数据结构(C语言版)
实验报告
专业班级测绘1011
学号10201151
姓名XX
实习地点C1 机房
指导教师史守正
目录
封面 (1)
目录 (2)
实验一线性表 (3)
一、程序设计的基本思想,原理和算法描述 (3)
二、源程序及注释(打包上传) (3)
三、运行输出结果 (4)
四、调试和运行程序过程中产生的问题及采取的措施 (6)
五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)
实验二栈和队列 (7)
一、程序设计的基本思想,原理和算法描述 (8)
二、源程序及注释(打包上传) (8)
三、运行输出结果 (8)
四、调试和运行程序过程中产生的问题及采取的措施 (10)
五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)
实验三树和二叉树 (11)
一、程序设计的基本思想,原理和算法描述 (11)
二、源程序及注释(打包上传) (12)
三、运行输出结果 (12)
四、调试和运行程序过程中产生的问题及采取的措施 (12)
五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)
实验四图 (13)
一、程序设计的基本思想,原理和算法描述 (13)
二、源程序及注释(打包上传) (14)
三、运行输出结果 (14)
四、调试和运行程序过程中产生的问题及采取的措施 (15)
五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)
实验五查找 (17)
一、程序设计的基本思想,原理和算法描述 (17)
二、源程序及注释(打包上传) (18)
三、运行输出结果 (18)
四、调试和运行程序过程中产生的问题及采取的措施 (19)
数据结构-栈与队列
操作数退栈,b=3 操作数退栈,a=2 a*b 得 c=6,进栈 p(+)>p(-),退栈 op=+ 操作数退栈,b=6 操作数退栈,a=4 a+b 得 c=10,进栈 p(#)<p(-),进栈
操作数进栈
栈
15
10 12
16
10 12
17
10 12
18
/(7-5)# (7-5)# 7-5)# -5)#
5)# )# )# )# )# )# # # # # # # # # #
p(-)<p(/),进栈 p(/)<p((),进栈
操作数进栈 p(()<p(-),进栈
操作数进栈 p(-)>p()),退栈 op=-
操作数退栈,b=5 操作数退栈,a=7 a-b 得 c=2,进栈 p(()=p()),去括号 p(/)>p(#,退栈 op=/ 操作数退栈,b=2 操作数退栈,a=12 a/b 得 c=6,进栈 p(-)>p(#),退栈 op=操作数退栈,b=6 操作数退栈,a=10 a-b 得 c=4,进栈 p(#)=p(#),算法结束
栈与队列
CONTENTS
目
录
01
栈
02
队列
03
应用实例
04 本章小结
01
实验报告——栈和队列的应用
实验5 栈和队列的应用
目的和要求:
(1)熟练栈和队列的基本操作;
(2)能够利用栈与队列进行简单的应用。
一、题目
题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。例如,a+b&b+a等等。
题目2. 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题,并实现。
题目3. 打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。
题目4. 假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
题目5. 利用循环链队列求解约瑟夫环问题。
请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。
选择题目3:打印机提供的网络共享打印功能采用了
缓冲池技术,队列就是实现这个缓冲技
术的数据结构支持。
二、程序清单
第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社
三、链栈
typedef struct Lsnode { ElemType data;
struct Lsnode *next; } Lsnode *top;
一个链表栈由栈顶指针top唯一确定。
10
1、链栈的主要运算
进栈操作 void Push(Lsnode *top; ElemType x)
{ p=(Lsnode *)malloc(sizeof(Lsnode)); p->data=x; p->next=top->next; top->next=p; }/*Push*/
取栈顶元素: GETTOP(S)
取栈S中栈顶元素。
判栈空: EMPTY(S)
4
例1:设栈的输入序列是(1,2,3,4),则 不可能是其出栈序列 A.1243 B.2134 C.1432 D.4312 E.3214
例2:依次读入数据元素序列(a,b,c,d,e,f,g) 进栈,每进一个元素,机器可要求下一个元 素进栈或出栈;如此进行,则栈空时弹出的 元素构成的序列是以下哪些序列? A.decfbga B.fegdacb C.efdgbca D.cdbefag
指针指向一维数组开头,称为队满。 但有可能出现这样情况,尾指针指向一维数组最
后,但前面有很多元素已经出队,即空出很多位置, 这时要插入元素,仍然会发生溢出。我们将这种溢出 称为“假溢出”。
数据结构中的栈与队列的应用场景
数据结构中的栈与队列的应用场景栈与队列是数据结构中常见的两种基本数据类型,它们在不同的应用场景中发挥着重要作用。下面将分别介绍栈和队列的应用场景。
栈的应用场景:
1. 编辑器的撤销操作:在编辑器中,撤销(undo)操作是一个常见需求。撤销操作通常是按照用户操作的反序执行,因此可以使用栈来存储每一次的操作,当用户执行撤销操作时,从栈中弹出最近的操作并执行对应的反操作。
2. 后退按钮的实现:在浏览器中,后退按钮用于返回上一个访问的网页。通过使用栈来存储用户的访问记录,每当用户访问一个新的页面时,将该页面的地址压入栈中。当用户点击后退按钮时,从栈中弹出最近访问的页面地址并跳转到该页面。
3. 函数调用与返回:在程序中,函数的调用和返回通常遵循“后进先出”的原则,即后调用的函数先返回。因此,可以使用栈来实现函数调用与返回的过程。每当一个函数被调用时,将该函数的执行环境(包括参数、局部变量等)压入栈中;当函数执行完毕后,从栈中弹出该函数的执行环境,恢复上一个函数的执行。
队列的应用场景:
1. 消息队列:在分布式系统和异步通信中,消息队列用于解耦发送方和接收方之间的耦合性。发送方将消息发送到队列的末尾,接收方
从队列的头部获取消息进行处理。消息队列可以实现异步处理、削峰
填谷等功能,常见的消息队列系统有RabbitMQ和Kafka等。
2. 操作系统中的进程调度:在操作系统中,进程调度用于控制多个
进程的执行顺序。常见的调度算法中,有使用队列来实现的先来先服
务(FCFS)调度算法和轮转调度算法。进程按照到达时间的顺序加入
栈和队列的应用(算法与数据结构课程设计)
栈和队列的应用
一、问题描述
栈和队列是一种常见的数据结构,是两种非常重要的线性结构,也都是线性表,它们是操作受限的的线性表,有顺序栈、链式栈、链式队列和循环队列等形式。它们广泛应用在各种软件系统中。本题就是要用这些线性结构先完成基本的应用,如回文,逆置。再编写一个简易的停车场管理系统,完成对车辆出入库的管理、停车时间的记录和管理费用的结算。
二、基本要求
1、选择顺序栈和链队列,完成回文判断、字符串的逆置;
2、选择链栈和循环队列,完成回文判断、字符串的逆置;
3、运用栈和队列,完成简易停车场管理系统,要求:
(1)车辆入库管理及时间记录;
(2)车辆出库管理、时间的记录及管理费用的结算;
(3)若停车场已满则车辆进入便车道等候。
三、测试数据
1、回文判断的测试数据:abcbc@;
2、字符串逆置的测试数据:abcdef;
3、停车场管理系统测试数据:
(1)输入A1、A2、A3实现车辆的入库及对便车道进行测试;
(2)输入D1对车辆出库及管理费用结算进行测试。
四、算法思想
1、(1)定义顺序栈和链队列及关于它们的基本操作,如定义栈和队列、求栈和队列的长度、入栈出栈、入队列出队列等。方便后面函数的调用,是实现程序的基石。(链栈和循环队列也是如此)
2、(1)编写函数Palindrome_Test来实现字符串的回文判断,回文是利用了栈的反序输出原则而队列则是顺序输出这个思想来实现的。往栈和队列输入同一组字符,再将它们一起输出,这样栈输出的字符就与原来的顺序相反了,而队列输出的字符与原来的顺序仍然是一样的,这样比较它们输出的字符是否相等就可以判断是否是回文了。是则输出1,不是则输出。
栈和队列教学实例在数据结构中的应用研究
栈和队列教学实例在数据结构中的应用研究
栈和队列是数据结构中非常重要的两种基本数据结构,它们广泛应用于计算机科学的各个领域。在教学实例中,栈和队列的应用研究可以帮助学生更好地理解这两种数据结构的特点和用途。
首先,我们来看栈在数据结构中的应用。栈是一种后进先出(LIFO)的数据结构,可以通过压栈和出栈操作来实现数据的存储和访问。在教学实例中,可以通过模拟浏览器的前进和后退功能来介绍栈的应用。当用户在浏览器中点击“前进”或“后退”按钮时,实际上就是在操作一个栈,将浏览历史记录依次入栈或出栈,以实现页面的跳转。通过这个实例,学生可以直观地理解栈的操作和特点。
接着,我们来看队列在数据结构中的应用。队列是一种先进先出(FIFO)的数据结构,可以通过入队和出队操作来实现数据的存储和访问。在教学实例中,可以通过模拟排队等候的场景来介绍队列的应用。例如,当有多个任务需要处理时,可以将任务依次加入队列,然后按照队列的顺序一个一个地处理,确保任务的执行顺序和公平性。通过这个实例,学生可以理解队列的操作和应用场景。
除了上述实例,栈和队列在算法和数据处理中还有许多其他应用。比如,栈可以用于实现递归算法的函数调用栈,队列可以用于实现广度优先搜索算法中的节点遍历。在教学中,可以结合具体的算法实现或应用场景,让学生更深入地理解栈和队列的作用和价值。
总的来说,栈和队列在数据结构中的应用研究可以帮助学生加深对这两种基本数据结构的理解,培养他们的数据处理和算法设计能力。通过生动的教学实例,可以让学生在实践中体会栈和队列的实际应用,从而更好地掌握这两种数据结构的特点和用途。希望以上内容能够满足您的需求,如有其他问题,欢迎继续咨询。
栈与队列实现先进先出和后进先出的数据结构
栈与队列实现先进先出和后进先出的数据结
构
数据结构是计算机科学中一门重要的基础课程,其中栈(Stack)和
队列(Queue)是常用的数据结构。栈和队列都具有不同的特点和应用
场景,能够满足先进先出(FIFO)和后进先出(LIFO)的要求。
一、栈的实现先进先出
栈是一种线性数据结构,具有后进先出(LIFO)的特点。在栈中,
只能在栈的一端进行操作,称为栈顶。栈的基本操作包括入栈(Push)和出栈(Pop)。
1. 入栈(Push)操作:
当要向栈中添加元素时,将新元素放置在栈顶,并将栈顶指针向上
移动一位。该操作保证了后添加的元素会处于栈顶的位置。
2. 出栈(Pop)操作:
当要从栈中移除元素时,将栈顶的元素弹出,并将栈顶指针向下移
动一位。该操作保证了最后添加的元素会最先被移除。
栈的实现可以使用数组或链表来存储元素。使用数组实现时,需要
指定栈的最大容量。使用链表实现时,栈的容量可以动态扩展。
二、队列的实现先进先出
队列是一种线性数据结构,具有先进先出(FIFO)的特点。在队列中,元素从队尾入队,从队头出队。队列的基本操作包括入队(Enqueue)和出队(Dequeue)。
1. 入队(Enqueue)操作:
当要向队列中添加元素时,将新元素放置在队尾,并将队尾指针向
后移动一位。该操作保证了后添加的元素会处于队列的尾部。
2. 出队(Dequeue)操作:
当要从队列中移除元素时,将队头的元素弹出,并将队头指针向后
移动一位。该操作保证了最早添加的元素会最先被移除。
队列的实现也可以使用数组或链表。与栈不同的是,队列的实现更
数据结构 3.1栈和队列(顺序及链栈定义和应用)
例3:行编辑程序问题
“每接受一个字符即存入存储器” ? 合理的作法是:
在用户输入一行的过程中,允许用户输入出差 错,并在发现有误时可以及时更正。
设立一个输入缓冲区,用以接受用户输入的 一行字符,然后逐行存入用户数据区; 并假设 “#”为退格符,“@”为退行符。
}StackNode,*LinkStack;
StackNode ss; LinkStack pss;
链栈
链栈存储的特点 链栈各个基本操作顺序实现 完整的链栈c语言程序
第一种操作:初始化创建
构造一个空链表 LinkStack InitStack() { LinkStack ls; ls=NULL; return ls;}
# $ $ # #
#
## ##
##
# #
##
# # #
#
## # ## # # #
#
Q #
##########
求迷宫路径算法的基本思想
若当前位置“可通”,则纳入路径,继续( 向东)前进; 若当前位置“不可通”,则后退,换方向 继续探索; 若四周“均无通路”,则将当前位置从路 径中删除出去。
设定当前位置的初值为入口位置; do{ 若当前位置可通, 则{将当前位置插入栈顶;
数据结构实验2——栈和队列实验报告
数据结构实验报告
实验名称:实验2——栈和队列
1 实验目的
通过选择下面五个题目之一进行实现,掌握如下内容:
进一步掌握指针、模板类、异常处理的使用
掌握栈的操作的实现方法
掌握队列的操作的实现方法
学习使用栈解决实际问题的能力
学习使用队列解决实际问题的能力
2 实验内容
利用栈结构实现八皇后问题。
八皇后问题19世纪著名的数学家高斯于1850年提出的。他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。请设计算法打印所有可能的摆放方法。
提示:
1、可以使用递归或非递归两种方法实现
2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜
线上
2. 程序分析
主程序:
#include<iostream>
using namespace std;
const int StackSize=8; //皇后的个数
int num=0;
template <class T>
class SeqStack //定义顺序栈模板类
{
public:
SeqStack(){top=-1;} //构造函数,初始化空栈
void Push(T x); //入栈操作
void Pop();//出栈操作
void PlaceQueen(int row); //放置皇后
bool Judgement();//判断是否符合条件
void Print();//输出符合条件的皇后排列
bool Empty(){if(top==-1) return true;else return false;}; //判断栈是否为空
数据结构课程实验报告
数据结构课程实验报告
一、实验目的
本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基
本操作,包括线性结构、树形结构和图形结构。同时,也要求学生能
够熟练运用C++语言编写程序,并且能够正确地使用各种算法和数据结构解决具体问题。
二、实验内容
本次实验涉及到以下几个方面:
1. 线性表:设计一个线性表类,并且实现线性表中元素的插入、删除、查找等基本操作。
2. 栈和队列:设计一个栈类和队列类,并且分别利用这两种数据结构
解决具体问题。
3. 二叉树:设计一个二叉树类,并且实现二叉树的遍历(前序遍历、
中序遍历和后序遍历)。
4. 图论:设计一个图类,并且利用图论算法解决具体问题(如最短路径问题)。
三、实验过程
1. 线性表
首先,我们需要设计一个线性表类。在这个类中,我们需要定义一些成员变量(如线性表大小、元素类型等),并且定义一些成员函数(如插入元素函数、删除元素函数等)。在编写代码时,我们需要注意一些细节问题,如边界条件、异常处理等。
2. 栈和队列
接下来,我们需要设计一个栈类和队列类。在这两个类中,我们需要定义一些成员变量(如栈顶指针、队头指针等),并且定义一些成员函数(如入栈函数、出栈函数、入队函数、出队函数等)。在编写代码时,我们需要注意一些细节问题,如空间不足的情况、空栈或空队列的情况等。
3. 二叉树
然后,我们需要设计一个二叉树类,并且实现二叉树的遍历。在这个
类中,我们需要定义一个节点结构体,并且定义一些成员变量(如根
节点指针、节点数量等),并且定义一些成员函数(如插入节点函数、删除节点函数、遍历函数等)。在编写代码时,我们需要注意一些细
《数据结构》实验指导及实验报告栈和队列
《数据结构》实验指导及实验报告栈和队列
实验四栈和队列
⼀、实验⽬的
1、掌握栈的结构特性及其⼊栈,出栈操作;
2、掌握队列的结构特性及其⼊队、出队的操作,掌握循环队列的特点及其操作。
⼆、实验预习
说明以下概念
1、顺序栈:
2、链栈:
3、循环队列:
4、链队
三、实验内容和要求
1、阅读下⾯程序,将函数Push和函数Pop补充完整。要求输⼊元素序列1 2 3 4 5 e,运⾏结果如下所⽰。#include
#include
#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){
栈和队列123
实验报告
填写内容时,可把表格扩大。实验的源程序代码(要有注释)附在表后。题目一程序代码:
#include"stdio.h"
#include"malloc.h"
#define MAXSIZE 100
typedef char elemtype;
typedef struct
{
elemtype data[MAXSIZE];
int top;
}SeqStack;
typedef struct
{
elemtype data[MAXSIZE];
int front,rear;
}SeqQueue;
SeqStack *InitStack(SeqStack *S)
{
S=(SeqStack *)malloc(sizeof(SeqStack));
S->top=-1;
return(S);
}
int Push(SeqStack *S,int item)
{
if(S->top==MAXSIZE-1)
{
printf("Stack overflow\n");
return 0;
}
else
{
S->data[++S->top]=item;
return 1;
}
}
elemtype Pop(SeqStack *S)
{
if(S->top==-1)
{
printf("Stack is empty.\n");
return 0;
}
else
{
S->top--;
return(S->data[S->top+1]);
}
}
SeqQueue *InitQueue(SeqQueue *Q)
{
Q=(SeqQueue *)malloc(sizeof(SeqQueue));
数据结构 第3章 栈和队列PPT课件
{
if (s.top[0]+1==s.top[1]) cout<<“overflow”
else if (k==0) { s.top[0]++;s.stack[s.top[0]]=x;}
else {s.top[1]--; s.stack[s.topFra Baidu bibliotek1]]=x;}
}
******上课时请保持课堂的安静,谢谢大家!!!
3.1.4 顺序栈 1、顺序栈的数据类型
CONST int maxsize=maxlen;
//定义栈的最大容量为maxlen
Struct seqstack
{ elemtype stack[maxsize]; //将栈中元素定义 为elemtype类型
int top;
//:指向栈顶位置的指针
}
******上课时请保持课堂的安静,谢谢大家!!!
Int empty(s) //判断栈S是否为空,若为空,返回值为1,否则返回 值为0
End stack
******上课时请保持课堂的安静,谢谢大家!!!
30.10.2020
× 第8页
数据结构 电子教案 — [ 湖北汽车工业学院 软件教研室 马春江 特别制作 ] 首页 尾页 上页 下页 范例 讨论 考题 帮助 关于 结束
30.10.2020
数据结构实验报告——栈和队列
3、从一个小小的迷宫问题,引出了许多知识,这种探索式的学习是很有意义的。从迷宫基本的递归和回溯到栈的运用和理解,再到队列的运用,后又到树与图以及队列的综合运用,将很多知识点串联起来了,加深了理解。同时探索式地学习迪杰斯特拉算法也收获颇多。
cout<<"最短路径之一如下:"<<endl;
ShortestPath();
}
void EnQueue(int i,int j,int k)
{
Q[rear].x = i;
Q[rear].y = j;//保存当前节点对应的坐标位置
Q[rear].parent_id = k;//保存父节点的序号
Q[rear].node_id = rear;//保存当前节点序号
C++实现:
voidShortestPath_BFS(inti ,intj)
{
intcount,m,n,k;
EnQueue(i,j,-1);Map[1][1] = 1;//起点入队,标记起点已走过
while(true)
{
count = 1;
数据结构实验报告
数据结构实验报告
一、实验目的
数据结构是计算机科学中的重要基础课程,通过本次实验,旨在加
深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解和
运用,提高编程能力和问题解决能力,培养算法设计和分析的思维。
二、实验环境
本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容
1、数组与链表的实现与操作
分别实现整数数组和整数链表的数据结构。
实现数组和链表的插入、删除、查找操作,并比较它们在不同操作下的时间复杂度。
2、栈与队列的应用
用数组实现栈结构,用链表实现队列结构。
模拟栈的入栈、出栈操作和队列的入队、出队操作,解决实际问题,如表达式求值、任务调度等。
3、二叉树的遍历
构建二叉树的数据结构。
实现先序遍历、中序遍历和后序遍历三种遍历算法,并输出遍历结果。
4、图的表示与遍历
用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先搜索(DFS)和广度优先搜索(BFS)算法,并分析它们的时间复杂度。
四、实验步骤
1、数组与链表
数组的实现:
定义一个固定大小的整数数组,通过索引访问和操作数组元素。
链表的实现:
定义链表节点结构体,包含数据和指向下一个节点的指针。
插入操作:
对于数组,若插入位置在末尾,直接赋值;若不在末尾,需移动后续元素。对于链表,找到插入位置的前一个节点,修改指针。
删除操作:
数组需移动后续元素,链表修改指针即可。
查找操作:
数组通过索引直接访问,链表需逐个节点遍历。
2、栈与队列
栈的实现:
用数组模拟栈,设置栈顶指针。
队列的实现:
用链表模拟队列,设置队头和队尾指针。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浦江移动网络学院
实验报告书
课程名:《数据结构》
题目:线性数据结构实验
班级:
学号:
姓名:
线性表算法实现与应用报告要求
1目的与要求:
1)掌握栈与队列的数据类型描述及特点;
2)掌握栈的顺序和链式存储存表示与基本算法的实现;
3)掌握队列的链式和循环存储表示与基本操作算法实现;
4) 掌握栈与队列在实际问题中的应用和基本编程技巧;
5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数的运行过程抓获相关屏面验证程序设计的正确性;
7)认真书写实验报告,并在下周一以前按时提交。
2 实验内容或题目
(一)必做题:
1、实现顺序栈的创建(初始化)、压入(插入)、弹出(删除)操作,要求给出栈的操作变化过
程;
2、实现链栈的创建(初始化)、压入(插入)、弹出(删除)操作,要求给出栈的操作变化过程;
3、实现循环队列的创建、进队、出队等基本操作,并实时给出队列的操作变化状态;
4、实现链式队列的创建、进队、出队等基本操作,并实时给出队列的操作变化状态;
(二)选做题(有能力同学建议多做此类应用题目):
1、实现表达式求值算法;
2、用递归算法实现汉诺塔问题;
3、使用循环队列实现打印杨辉三角形算法。
3 实验步骤与源程序
第一题
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
#include
using namespace std;
typedef struct
{
int elem[Stack_Size];
int top;
}SeqStack;
void InitStack(SeqStack *S)
{
S->top =-1;
}
int IsEmpty(SeqStack *S)
{
return(S->top==-1?TRUE:FALSE);
}
int IsFull(SeqStack *S)
{
return(S->top==Stack_Size-1?TRUE:FALSE); }
int Push(SeqStack *S,int x)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top] = x;
return(TRUE);
}
int Pop(SeqStack *S,int *x)
{
if(S->top == -1)
return(FALSE);
else
{
*x = S->elem[S->top];
S->top--;
return(TRUE);
}
}
int GetTop(SeqStack *S,int *x)
{
if(S->top == -1)
return(FALSE);
else
{
*x = S->elem[S->top];
return(TRUE);
}
int main()
{
SeqStack S;
int x;
int y;
int i;
InitStack(&S);
if(!IsFull(&S))
cout<<"栈为空"< cout<<"输入要压入的元素:"< { cin>>y; Push(&S,y); } GetTop(&S,&x); cout<<"栈首元素:"< cout< cout<<"弹出的元素为:"< { Pop(&S,&x); cout< } cout< return 0; } 第二题 #define TRUE 1 #define FALSE 0 #include using namespace std; typedef struct node { int data; struct node *next; }LinkStackNode; typedef LinkStackNode *LinkStack; int GetTop(LinkStack top,int *x) if(NULL==top->next ) return FALSE; *x=top->next ->data ; return TRUE; } int IsEmpty(LinkStack top) { return NULL==top->next?TRUE:FALSE; } int InitStack(LinkStack *top) { *top=(node*)malloc(sizeof(node)); if(NULL==*top) return FALSE; (*top)->next =NULL; return TRUE; } int Push(LinkStack top, int x) { LinkStackNode *temp; temp=(LinkStackNode *)malloc(sizeof(LinkStackNode)); if(temp==NULL) return(FALSE); temp->data=x; temp->next=top->next; top->next=temp; return(TRUE); } int Pop(LinkStack top, int *x) { LinkStackNode * temp; temp=top->next; if(temp==NULL) return(FALSE); top->next=temp->next; *x=temp->data; free(temp); return(TRUE); } void main() {