数据结构实验—栈及其应用

合集下载

栈的实验报告结论(3篇)

栈的实验报告结论(3篇)

第1篇一、实验目的1. 理解栈的基本概念和操作;2. 掌握栈的顺序存储和链式存储实现方法;3. 熟悉栈在程序设计中的应用。

二、实验内容1. 栈的顺序存储结构实现;2. 栈的链式存储结构实现;3. 栈的基本操作(入栈、出栈、判空、求栈顶元素);4. 栈在程序设计中的应用。

三、实验方法1. 采用C语言进行编程实现;2. 对实验内容进行逐步分析,编写相应的函数和程序代码;3. 通过运行程序验证实验结果。

四、实验步骤1. 实现栈的顺序存储结构;(1)定义栈的结构体;(2)编写初始化栈的函数;(3)编写入栈、出栈、判空、求栈顶元素的函数;(4)编写测试程序,验证顺序存储结构的栈操作。

2. 实现栈的链式存储结构;(1)定义栈的节点结构体;(2)编写初始化栈的函数;(3)编写入栈、出栈、判空、求栈顶元素的函数;(4)编写测试程序,验证链式存储结构的栈操作。

3. 栈在程序设计中的应用;(1)实现一个简单的四则运算器,使用栈进行运算符和操作数的存储;(2)实现一个逆序输出字符串的程序,使用栈进行字符的存储和输出;(3)编写测试程序,验证栈在程序设计中的应用。

五、实验结果与分析1. 顺序存储结构的栈操作实验结果:(1)入栈操作:在栈未满的情况下,入栈操作成功,栈顶元素增加;(2)出栈操作:在栈非空的情况下,出栈操作成功,栈顶元素减少;(3)判空操作:栈为空时,判空操作返回真,栈非空时返回假;(4)求栈顶元素操作:在栈非空的情况下,成功获取栈顶元素。

2. 链式存储结构的栈操作实验结果:(1)入栈操作:在栈未满的情况下,入栈操作成功,链表头指针指向新节点;(2)出栈操作:在栈非空的情况下,出栈操作成功,链表头指针指向下一个节点;(3)判空操作:栈为空时,判空操作返回真,栈非空时返回假;(4)求栈顶元素操作:在栈非空的情况下,成功获取栈顶元素。

3. 栈在程序设计中的应用实验结果:(1)四则运算器:成功实现加、减、乘、除运算,并输出结果;(2)逆序输出字符串:成功将字符串逆序输出;(3)测试程序:验证了栈在程序设计中的应用。

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用

数据结构实验三栈和队列的应用数据结构实验三:栈和队列的应用在计算机科学领域中,数据结构是组织和存储数据的重要方式,而栈和队列作为两种常见的数据结构,具有广泛的应用场景。

本次实验旨在深入探讨栈和队列在实际问题中的应用,加深对它们特性和操作的理解。

一、栈的应用栈是一种“后进先出”(Last In First Out,LIFO)的数据结构。

这意味着最后进入栈的元素将首先被取出。

1、表达式求值在算术表达式的求值过程中,栈发挥着重要作用。

例如,对于表达式“2 + 3 4”,我们可以通过将操作数压入栈,操作符按照优先级进行处理,实现表达式的正确求值。

当遇到数字时,将其压入操作数栈;遇到操作符时,从操作数栈中弹出相应数量的操作数进行计算,将结果压回操作数栈。

最终,操作数栈中的唯一值就是表达式的结果。

2、括号匹配在程序代码中,检查括号是否匹配是常见的任务。

可以使用栈来实现。

遍历输入的字符串,当遇到左括号时,将其压入栈;当遇到右括号时,弹出栈顶元素,如果弹出的左括号与当前右括号类型匹配,则继续,否则表示括号不匹配。

3、函数调用和递归在程序执行过程中,函数的调用和递归都依赖于栈。

当调用一个函数时,当前的执行环境(包括局部变量、返回地址等)被压入栈中。

当函数返回时,从栈中弹出之前保存的环境,继续之前的执行。

递归函数的执行也是通过栈来实现的,每次递归调用都会在栈中保存当前的状态,直到递归结束,依次从栈中恢复状态。

二、队列的应用队列是一种“先进先出”(First In First Out,FIFO)的数据结构。

1、排队系统在现实生活中的各种排队场景,如银行排队、餐厅叫号等,可以用队列来模拟。

新到达的顾客加入队列尾部,服务完成的顾客从队列头部离开。

通过这种方式,保证了先来的顾客先得到服务,体现了公平性。

2、广度优先搜索在图的遍历算法中,广度优先搜索(BreadthFirst Search,BFS)常使用队列。

从起始节点开始,将其放入队列。

栈及其应用实验报告

栈及其应用实验报告

一、实验目的1. 理解栈的定义、特点、逻辑结构及其在计算机科学中的应用。

2. 掌握顺序栈和链栈的存储结构及基本操作实现。

3. 通过具体应用实例,加深对栈的理解,提高问题分析和解决的能力。

二、实验内容1. 实现顺序栈和链栈的基本操作。

2. 编写一个算法,判断给定的字符序列是否为回文。

3. 编写一个算法,利用栈的基本运算将指定栈中的内容进行逆转。

4. 给定一个整数序列,实现一个求解其中最大值的递归算法。

三、实验步骤1. 实现顺序栈和链栈的基本操作(1)顺序栈的存储结构及操作实现顺序栈使用数组来实现,其基本操作包括:- 初始化栈:使用数组创建一个空栈,并设置栈的最大容量。

- 入栈:将元素插入栈顶,如果栈满,则返回错误。

- 出栈:从栈顶删除元素,如果栈空,则返回错误。

- 获取栈顶元素:返回栈顶元素,但不删除。

- 判断栈空:判断栈是否为空。

(2)链栈的存储结构及操作实现链栈使用链表来实现,其基本操作包括:- 初始化栈:创建一个空链表,作为栈的存储结构。

- 入栈:在链表头部插入元素,如果链表为空,则创建第一个节点。

- 出栈:删除链表头部节点,如果链表为空,则返回错误。

- 获取栈顶元素:返回链表头部节点的数据。

- 判断栈空:判断链表是否为空。

2. 判断字符序列是否为回文编写一个算法,判断给定的字符序列是否为回文。

算法步骤如下:(1)使用顺序栈或链栈存储字符序列。

(2)从字符序列的头部开始,依次将字符入栈。

(3)从字符序列的尾部开始,依次将字符出栈,并与栈顶元素比较。

(4)如果所有字符均与栈顶元素相等,则字符序列为回文。

3. 利用栈的基本运算将指定栈中的内容进行逆转编写一个算法,利用栈的基本运算将指定栈中的内容进行逆转。

算法步骤如下:(1)创建一个空栈,用于存储逆转后的栈内容。

(2)从原栈中依次将元素出栈,并依次入新栈。

(3)将新栈的内容赋值回原栈,实现栈内容的逆转。

4. 求解整数序列中的最大值给定一个整数序列,实现一个求解其中最大值的递归算法。

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

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

数据结构_实验三_栈和队列及其应用(可编辑实验三:栈和队列及其应用1.实验目的:1.1掌握栈和队列的定义与基本操作。

1.2理解栈和队列的应用场景。

1.3熟悉栈和队列在计算机程序设计中的应用。

2.实验内容:2.1实现栈数据结构的基本操作:初始化、入栈、出栈、判断栈空、判断栈满、获取栈顶元素。

2.2实现队列数据结构的基本操作:初始化、入队、出队、判断队空、判断队满、获取队头元素。

2.3利用栈实现表达式求值。

2.4 利用队列解决Josephus问题。

3.实验步骤:3.1栈的实现:栈(Stack)是一种后进先出(LIFO)的数据结构,只能在一端进行插入和删除操作。

栈的实现可以使用数组或链表,这里以数组为例。

1)初始化栈:创建一个数组,设定一个栈指针top,初始时top值为-12)入栈操作:栈不满时,将元素插入到数组的top+1位置,然后top值加13)出栈操作:栈不空时,将数组的top位置的元素删除,然后top 值减14)判断栈空:当栈指针top为-1时,表示栈空。

5)判断栈满:当栈指针top达到数组的最大索引值时,表示栈满。

6)获取栈顶元素:栈不空时,返回数组的top位置的元素。

3.2队列的实现:队列(Queue)是一种先进先出(FIFO)的数据结构,插入操作在队尾进行,删除操作在队头进行。

队列的实现可以使用数组或链表,这里以数组为例。

1)初始化队列:创建一个数组,设定两个指针front和rear,初始时front和rear值均为-12)入队操作:队列不满时,将元素插入到数组的rear+1位置,然后rear值加13)出队操作:队列不空时,将数组的front+1位置的元素删除,然后front值加14)判断队空:当front和rear指针相等且都为-1时,表示队空。

5)判断队满:当rear指针达到数组的最大索引值时,表示队满。

6)获取队头元素:队列不空时,返回数组的front+1位置的元素。

3.3表达式求值:使用栈可以实现对表达式的求值。

数据结构实验-线性表及其实现栈和队列及其应用

数据结构实验-线性表及其实现栈和队列及其应用

数据结构实验报告一实验名称:线性表及其实现栈和队列及其应用1 实验目的及实验要求1.线性表目的要求:(1)熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现,以线性表的各种操作(建立、插入、删除等)的实现为实验重点;(2)通过本次实验帮助学生加深对顺序表、链表的理解,并加以应用;(3)掌握循环链表和双链表的定义和构造方法2.栈和队列目的要求:(1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们;(2)本实验训练的要点是“栈”的观点及其典型用法;(3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。

2实验内容及实验步骤(附运行结果截屏)1.线性表实验内容:(1)编程实现线性表两种存储结构(顺序存储、链式存储)中的基本操作的实现(线性表的创建、插入、删除和查找等),并设计一个菜单调用线性表的基本操作。

(2)建立一个按元素递增有序的单链表L,并编写程序实现:a)将x插入其中后仍保持L的有序性;b)将数据值介于min和max之间的结点删除,并保持L的有序性;c)(选做)将单链表L逆置并输出;(3)编程实现将两个按元素递增有序的单链表合并为一个新的按元素递增的单链表。

注:(1)为必做题,(2)~(3)选做。

2.栈和队列实验内容:(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);(2)应用栈的基本操作,实现数制转换(任意进制);(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);(4)利用栈实现任一个表达式中的语法检查(括号的匹配)。

(5)利用栈实现表达式的求值。

注:(1)~(2)必做,(3)~(5)选做。

实验步骤:先编写线性表和栈和队列的类模板,实现各自的基础结构,之后按照要求编写适当的函数方法(公共接口),最后完成封装。

编写主函数直接调用即可。

核心代码://LinearList.h 顺序表//类的声明1.template<class T>2.class LinearList3.{4.public:5.LinearList(int sz = default_size);6.~LinearList();7.int Length()const; //length of the linear8.int Search(T x)const; //search x in the linear and return its order number9.T GetData(int i)const; //get i th order's data10.bool SetData(int i,T x); //change i th order's data to x11.bool DeleteData(int i);12.bool InsertData(int i,T x);13.void output(bool a,int b,int c); //print the linear14.void ReSize(int new_size);15.16.private:17.T *data;18.int max_size,last_data;19.};//构造函数1.template<class T>2.LinearList<T>::LinearList(int sz)3.{4.if(sz>0)5.{6.max_size = sz;st_data=-1;8.data=new T[max_size];9.if(data == NULL)10.{11.cerr<<"Memory creat error!"<<endl;12.exit(1);13.}14.}15.else16.{17.cerr<<"Size error!"<<endl;18.exit(1);19.}20.}//Qlist.h 链式表//模板类的声明1.template<class T>2.struct LinkNode3.{4.T data;5.LinkNode<T> *link;6.LinkNode(LinkNode<T> *ptr = NULL)7.{8.link = ptr;9.}10.LinkNode(const T item,LinkNode<T> *ptr = NULL)11.{12.data = item;13.link = ptr;14.}15.};16.17.template<class T>18.class Qlist: public LinkNode<T>19.{20.public:21.Qlist();22.Qlist(const T x);23.Qlist(Qlist<T>&L);24.~Qlist();25.void MakeEmpty();26.int Length()const; //length of the linear27.int Search(T x)const; //search x in the linear and return its order number28.LinkNode<T> *Locate(int i);29.T GetData(int i); //get i th order's data30.bool SetData(int i,T x); //change i th order's data to x31.bool DeleteData(int i);32.bool InsertData(int i,T x);33.void output(bool a,int b,int c); //print the linear34.35.protected:36.LinkNode<T> *first;37.};//构造函数1.template<class T>2.Qlist<T>::Qlist(Qlist<T>&L)3.{4.T value;5.LinkNode<T>*src = L.getHead();6.LinkNode<T>*des = first = new LinkNode<T>;7.while(src->link != NULL)8.{9.value = src->link->data;10.des->link = new LinkNode<T>(value);11.des = des->link;12.src = src->link;13.}14.des->link = NULL;15.}截屏:3 实验体会(实验遇到的问题及解决方法)刚开始的时候本想先写线性表的类模板然后分别进行继承写顺序表和链式表甚至是以后的栈和队列。

数据结构实验报告栈

数据结构实验报告栈

数据结构实验报告:栈摘要:本实验报告旨在介绍栈这一重要的数据结构,以及在实际应用中的使用。

栈是一种先进后出(LIFO)的数据结构,在计算机科学中有着广泛的应用。

本报告将详细介绍栈的定义、基本操作以及应用实例,并根据实验结果进行分析和总结。

1. 引言栈是一种基于线性表的数据结构,具有后进先出(LIFO)的特性。

它可以通过两个基本操作来实现:push(入栈)将元素添加到栈顶,pop(出栈)将栈顶元素移除。

栈在计算机科学中被广泛应用,如函数调用、表达式求值、括号匹配等。

2. 栈的实现栈可以通过数组或链表来实现。

数组实现的栈称为顺序栈,链表实现的栈称为链式栈。

无论是哪种实现方式,都需要实现以下基本操作:- push(element): 将元素添加到栈顶。

- pop(): 移除栈顶元素并返回。

- top(): 返回栈顶元素的值。

- isEmpty(): 判断栈是否为空。

- isFull(): 判断栈是否已满(仅顺序栈需要实现)。

3. 栈的应用3.1 函数调用栈在函数调用中起着关键作用。

每当一个函数被调用时,当前函数的局部变量、返回地址等信息都会被压入栈中。

当函数执行完毕时,这些信息会从栈中弹出,继续执行上一级函数。

3.2 表达式求值栈常用于表达式求值,特别是中缀表达式的转换和计算。

通过将中缀表达式转换为后缀表达式,可以方便地进行计算。

栈可以临时存储运算符,并根据运算符的优先级进行弹出和计算。

3.3 括号匹配栈的一个重要应用是括号匹配。

通过遍历字符串,将左括号压入栈中。

每当遇到右括号时,如果栈顶元素是匹配的左括号,则弹出栈顶元素;否则,表示括号不匹配。

4. 实验结果与分析根据我们对栈的实现和应用进行的实验,以下是我们得到的结论:- 通过数组实现的顺序栈在空间上存在一定的限制,可能会出现栈溢出的情况。

- 通过链表实现的链式栈没有空间限制,可以动态地添加和删除元素。

- 栈在函数调用和表达式求值中展现出了高效的性能,并能够简化程序的设计。

栈的运用实验报告

栈的运用实验报告

一、实验目的1. 理解栈的基本概念、特点及逻辑结构;2. 掌握栈的顺序存储和链式存储结构;3. 熟练掌握栈的基本操作,如入栈、出栈、判断栈空等;4. 理解栈在递归算法中的应用;5. 探究栈在实际问题中的应用。

二、实验内容1. 栈的定义与特点2. 栈的顺序存储结构3. 栈的链式存储结构4. 栈的基本操作5. 栈在递归算法中的应用6. 栈在实际问题中的应用三、实验步骤1. 栈的定义与特点(1)栈是一种后进先出(LIFO)的数据结构;(2)栈的元素只能从一端(栈顶)进行插入和删除操作;(3)栈具有两个基本操作:入栈和出栈。

2. 栈的顺序存储结构(1)使用数组来实现栈的顺序存储结构;(2)定义一个数组作为栈的存储空间;(3)定义栈顶指针top,初始值为-1;(4)定义栈的最大容量maxSize。

3. 栈的链式存储结构(1)使用链表来实现栈的链式存储结构;(2)定义一个链表节点,包含数据域和指针域;(3)定义栈顶指针top,初始时指向链表头节点。

4. 栈的基本操作(1)入栈操作:将元素插入到栈顶,栈顶指针向上移动;(2)出栈操作:删除栈顶元素,栈顶指针向下移动;(3)判断栈空:判断栈顶指针是否为-1,是则栈空,否则栈非空。

5. 栈在递归算法中的应用(1)斐波那契数列的递归算法;(2)汉诺塔问题;(3)迷宫问题。

6. 栈在实际问题中的应用(1)括号匹配问题;(2)表达式求值问题;(3)递归函数的调用栈。

四、实验结果与分析1. 栈的定义与特点通过本次实验,我们深入理解了栈的基本概念、特点及逻辑结构,掌握了栈的后进先出特性。

2. 栈的顺序存储结构使用数组实现栈的顺序存储结构,操作简单高效。

在实验过程中,我们实现了栈的基本操作,如入栈、出栈、判断栈空等。

3. 栈的链式存储结构使用链表实现栈的链式存储结构,具有灵活性和扩展性。

在实验过程中,我们实现了栈的基本操作,如入栈、出栈、判断栈空等。

4. 栈的基本操作通过实验,我们熟练掌握了栈的基本操作,如入栈、出栈、判断栈空等,为后续递归算法和实际问题中的应用奠定了基础。

栈的操作(实验报告)

栈的操作(实验报告)

引言:栈是一种常见的数据结构,它具有特殊的操作规则,即先进后出(LIFO)。

本文将介绍栈的操作,并结合实验报告的方式详细阐述栈的概念、基本操作以及应用场景。

概述:栈是一种线性数据结构,由相同类型的元素按照特定顺序排列而成。

在栈中,只能在栈顶进行插入和删除操作,其他位置的元素无法直接访问。

栈具有两个基本操作:压栈(push)和弹栈(pop)。

其中,压栈将一个元素添加到栈顶,弹栈则是删除栈顶的元素。

除了基本操作外,栈还具有其他常见的操作,如获取栈顶元素(top)、判断栈是否为空(empty)等。

正文内容:一、栈的基本操作1.压栈(push)push操作的实现原理和步骤在实际应用中的使用场景和例子2.弹栈(pop)pop操作的实现原理和步骤在实际应用中的使用场景和例子3.获取栈顶元素(top)top操作的实现原理和步骤在实际应用中的使用场景和例子4.判断栈是否为空(empty)empty操作的实现原理和步骤在实际应用中的使用场景和例子5.栈的大小(size)size操作的实现原理和步骤在实际应用中的使用场景和例子二、栈的应用场景1.括号匹配使用栈实现括号匹配的原理和过程在编译器、计算表达式等领域中的应用2.浏览器的后退和前进功能使用栈来记录浏览器访问历史的原理和过程实现浏览器的后退和前进功能3.函数调用和递归使用栈来实现函数调用和递归的原理和过程在程序执行过程中的应用和注意事项4.实现浏览器缓存使用栈来实现浏览器缓存的原理和过程提高用户浏览速度的实际应用案例5.撤销操作使用栈来实现撤销操作的原理和过程在编辑器、图形处理软件等领域的实际应用总结:本文详细介绍了栈的操作,包括基本操作(压栈、弹栈、获取栈顶元素、判断栈是否为空、栈的大小)和应用场景(括号匹配、浏览器的后退和前进功能、函数调用和递归、实现浏览器缓存、撤销操作)。

通过了解栈的操作和应用,我们可以更好地理解数据结构中的栈,并能够在实际问题中灵活运用栈的特性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《算法与数据结构》课程实验报告一、实验目的1.熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构。

2.实现栈的顺序存储结构,通过实验深入理解栈的操作特点。

二、实验内容及要求1.实现栈的存储结构及相关操作:进栈、出栈、取栈顶元素等。

2.使用该栈完成对一个字符串的逆序输出。

3.使用该栈完成判断表达式的括号是否匹配。

4.对算术表达式求值。

三、系统分析(1)数据方面:该栈数据元素类型采用浮点型,在此基础上进行栈的基本操作,并可将栈中数据使用文本文档保存。

在栈的应用中,采用的是存储字符元素类型的栈,并进行对字符的相关操作。

(2)功能方面:能实现栈的一些基本操作,主要包括:1.进栈操作:若栈不满,则将元素x插入至栈的栈顶,若栈满则进行溢出处理。

2.出栈操作:若栈不空,则函数返回该栈栈顶的元素,并且栈顶指针退1。

3.获取栈顶元素:若栈不空,则函数返回栈顶元素。

4.判断栈是否为空、判断栈是否满。

5.计算栈中元素个数:直接返回栈中元素个数。

6.清空栈内容:将栈顶指针赋为初始值。

7.保存数据:将栈中元素数据保存至文本文档中。

四、系统设计(1)设计的主要思路顺序栈可以采用顺序表作为其存储表示,为此,在顺序栈的声明中用顺序表定义它的存储空间。

存放栈元素的数组的头指针为*elements,该数组最大能允许存放元素个数为maxSize,当前栈顶位置由数组下标指针top知识。

并规定如果栈不空时,elements[0]为栈中第一个元素。

由于实验中还需完成栈的相关应用,故使用两个菜单分别完成栈的基本操作与栈的应用调试。

(2)数据结构的设计顺序栈定义为只允许在表的末端进行插入和删除的线性表。

允许插入和删除的一端叫做栈顶,而不允许插入和删除的另一端叫做栈底。

当栈中没有任何元素时则成为空战。

即栈又被称为后进先出的线性表,故与线性表的相关操作类似,在此基础上完成栈的相关操作及应用。

数据结构设计思路(3)基本操作的设计栈的基本操作主要包括进栈、出栈、弹出栈顶元素等。

主要难点是在栈相关应用的实现。

第一个应用即是通过栈的操作实现括号匹配。

思路则是依次扫描输入字符串,将左括号存放至栈中,后续扫描遇到右括号则与之相匹配,同时在栈顶删除左括号。

最后将括号匹配信息输出。

在实现栈进行表达式计算过程稍微复杂。

先编写一个Calculator类,该类实现表达式计算的进操作数、退操作数等操作,在主函数文件中编写将中缀表达式转为后缀表达式函数,将转化后的表达式在进行计算即可。

算法主要思路为:顺序扫描表达式每一项,如果是操作数则进行压栈,为操作符则弹出两个操作数,并进行指令运算,将结果再次压入栈中,处理完后,将结果输出即可。

由于为了实现多为操作数的计算故需作出相应改进,用一个字符串保存输入的表达式,在通过字符串操作将操作数和操作符保存至一个字符串数组中,再通过栈的操作将其转为后缀表达式并存放至字符串数组中,在在字符串数组的基础上进行表达式值得计算。

该函数可计算操作数为双精度的表达式。

五、编程环境与实验步骤(1)编程环境操作系统:Windows操作系统;编程工具软件:Visual Studio 2017(2)实验步骤程序相关文件为SeqStack模板类文件、Calculator类文件、以及主函数调试文件main.cpp。

Calculator类文件在栈应用操作中实现表达式相关计算,SeqStack 模板类文件包括栈的相关操作,例如进栈、出栈等操作。

主函数调试文件则是用于调试栈的基本操作,并且添加了相关栈应用的相关函数,可通过两个菜单的关联,完成栈的基本操作以及相关应用的实现。

(3)编译参数无编译参数,在Vs2017或其他版本中新建项目然后将三个文件main.cpp、Calculator.h、SeqStack.h添加到解决方案中的头文件中调试即可。

六、实现代码#include<iostream>#include"Calculator.h"#include<string>using namespace std;const int maxLength = 100; //最大匹配字符串长度int isp(char &a);//栈内优先数int icp(char &a);//栈外优先数void PrintMatchedPairs(char *expression);//栈的应用——括号匹配void postfix();//栈的应用——中缀表达式转化为后缀表达式void inverse(char *c);//栈的应用——字符串逆序输出void menu1();//栈的基本操作菜单void menu2();//栈的应用菜单string str2[1000];//用于存放中缀表达式int number = 0;//用于表示表达式中数据个数int main() {int fini = 0; int choose;while (!fini) {cout <<"***************************************"<< endl;cout <<"-----------1、栈的基本操作-------------"<< endl;cout <<"-----------2、栈的应用-----------------"<< endl;cout <<"-----------3、退出---------------------"<< endl;cout <<"***************************************"<< endl;cout <<"请输入你的选择[1-3]:"<< endl;cin >> choose;switch (choose) {case 1:menu1();break;case 2:menu2();break;case 3:fini = 1;break;default:cout <<"输入选择错误,请重新输入!"<< endl;}}return 0;}int isp(char &a) {switch (a) {case'#':return 0; break;case'(':return 1; break;case'*':case'%':case'/':return 5; break;case'+':case'-':return 3; break;case')':return 6; break;}}int icp(char &a) {switch (a) {case'#':return 0; break;case'(':return 6; break;case'*':case'%':case'/':return 4; break;case'+':case'-':return 2; break;case')':return 1; break;}}void PrintMatchedPairs(char *expression) {SeqStack<int> s(maxLength);int j, length = strlen(expression);for (int i = 1; i <=length; i++) {if (expression[i - 1] == '(')s.Push(i);else if (expression[i - 1] == ')') {if (s.Pop(j) == true)cout << j <<"与"<< i <<"匹配"<< endl;elsecout <<"没有与第"<< i <<"个右括号匹配的左括号!"<< endl;}}while (s.IsEmpty() == false) {s.Pop(j);cout <<"没有与第"<< j <<"个左括号匹配的右括号!"<< endl;}}void postfix() {SeqStack<char> s;char ch = '#';s.Push(ch);string str ; //用于存放表达式string num = "";//用于存放有多位的操作数cout <<"请输入表达式:"<< endl; cin >> str;for (int i = 0; i < str.length(); i++){if (str[i] == '0' || str[i] == '1' || str[i] == '2' || str[i] == '3' || str[i] == '4' || str[i] == '5' || str[i] == '6' || str[i] == '7' || str[i] == '8' || str[i] == '9' || str[i] == '.') {num = num + str[i];}else {char ch1;str2[number] = num; number++; num ="";s.getTop(ch1);if (isp(ch1) < icp(str[i])) {s.Push(str[i]);}else if (isp(ch1) > icp(str[i])) {char op;s.Pop(op);if (op != '(') {str2[number] = op; number++; i--;}}else {char ch3;s.Pop(ch3);}}}if (num !="") {str2[number] = num; number++; num ="";}while (!s.IsEmpty()){char ch4; s.Pop(ch4); str2[number] = ch4; number++;}}void inverse(char *c) {SeqStack<char> s; int i = 0; char ch;int l = strlen(c);for (int i = 0; i < l; i++)s.Push(c[i]);for (int i = 0; i < l; i++) {s.Pop(ch);cout << ch <<" ";}}void menu1() {int fini = 0; int choose;SeqStack<double> s;double x;//压栈元素double y;//存储出栈元素double z;//存储栈顶元素while (!fini) {cout <<"-----------一、栈的基本操作-------------"<< endl;cout <<"-----------1:进栈操作-------------------"<< endl;cout <<"-----------2:出栈操作-------------------"<< endl;cout <<"-----------3:读取栈顶元素---------------"<< endl;cout <<"-----------4:判断栈是否空---------------"<< endl;cout <<"-----------5:判断栈是否满---------------"<< endl;cout <<"-----------6:计算栈中元素个数-----------"<< endl;cout <<"-----------7:清空栈的内容---------------"<< endl;cout <<"-----------8:文件保存栈中元素-----------"<< endl;cout <<"-----------9:退出:---------------------"<< endl;cout <<"****************************************"<< endl;cout <<"请输入你的选择[1-9]:"<< endl;cin >> choose;switch (choose) {case 1:cout <<"输入进栈数:"<<endl;cin >> x;s.Push(x);break;case 2:s.Pop(y);cout <<"弹出元素是:"<< y << endl;break;case 3:s.getTop(z);cout <<"此时栈顶元素为:"<< z << endl;break;case 4:if (s.IsEmpty())cout <<"栈为空!"<< endl;elsecout <<"栈不为空!"<< endl;break;case 5:if(s.IsFull())cout <<"栈满!"<< endl;elsecout <<"栈不满!"<< endl;break;case 6:cout <<"此时栈中有"<< s.getSize() <<"个元素"<< endl;break;case 7:s.MakeEmpty();cout <<"栈被清空"<< endl;case 8:s.SaveFile();cout <<"保存成功!(数据由顶至底)"<< endl;cout <<"此时栈被清空!"<< endl;break;case 9:fini = 1;break;default:cout <<"输入选择错误,请重新输入!"<< endl;}}}void menu2() {int fini = 0; int choose;char c[maxLength];//输入字符串double x;Calculator ca(stackIncreament);while (!fini) {cout <<"-----------二、栈的应用-----------------"<< endl;cout <<"-----------1:括号匹配-------------------"<< endl;cout <<"-----------2:表达式的计算---------------"<< endl;cout <<"-----------3:字符串逆序输出-------------"<< endl;cout <<"-----------4:退出:---------------------"<< endl;cout <<"****************************************"<< endl;cout <<"请输入你的选择[1-4]:"<< endl;cin >> choose;switch (choose) {case 1:cin.get();cin.getline(c,maxLength);PrintMatchedPairs(c);break;case 2:postfix();ca.Run(x);cout << x << endl;break;case 3:cin.get();cin.getline(c, maxLength);cout <<"字符串逆序输出:"<< endl;inverse(c);cout << endl;break;case 4:fini = 1;break;default:cout <<"输入选择错误,请重新输入!"<< endl;}}}七、测试结果与说明栈的基本操作:进栈与出栈:进栈与读取元素:栈中元素个数:栈空或满:保存数据:栈的相关应用:字符串中括号匹配:字符串逆序输出:表达式计算:八、实验分析(1)算法的性能分析栈的括号匹配算法分析。

相关文档
最新文档