实验二、栈及其应用

合集下载

栈的实验报告结论(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)测试程序:验证了栈在程序设计中的应用。

实验二 栈和队列的基本操作实现及其应用

实验二   栈和队列的基本操作实现及其应用

实验二栈和队列的基本操作实现及其应用一、实验目的1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。

2、会用栈和队列解决简单的实际问题。

二、实验内容(可任选或全做)题目一、试写一个算法,判断依次读入的一个以@为结束符的字符序列,是否为回文。

所谓“回文“是指正向读和反向读都一样的一字符串,如“321123”或“ableelba”。

相关常量及结构定义:# define STACK_INIT_SIZE 100# define STACKINCREMENT 10# define OK 1# define ERROR 0typedef 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)题目二、编程模拟队列的管理,主要包括:出队列、入队、统计队列的长度、查找队列某个元素e、及输出队列中元素。

[实现提示]:参考教材循环队列的有关算法,其中后两个算法参考顺序表的实现。

题目三、RailsDescriptionThere is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited thattime. It was possible to establish only a surface track. Moreover, it turned out that the station could be only a dead-end one (see picture) and due to lack of available space it could have only one track.The local tradition is that every train arriving from the direction A continues in the direction B with coaches reorganized in some way. Assume that the train arriving from the direction A has N <= 1000 coaches numbered in increasing order 1, 2, ..., N. The chief for train reorganizations must know whether it is possible to marshal coaches continuing in the direction B so that their order will be a1, a2, ..., aN. Help him and write a program that decides whether it is possible to get the required order of coaches. You can assume that single coaches can be disconnected from the train before they enter the station and that they can move themselves until they are on the track in the direction B. You can also suppose that at any time there can be located as many coaches as necessary in the station. But once a coach has entered the station it cannot return to the track in the direction A and also once it has left the station in the direction B it cannot return back to the station.InputThe input consists of blocks of lines. Each block except the last describes one train and possibly more requirements for its reorganization. In the first line of the block there is the integer N described above. In each of the next lines of the block there is a permutation of 1, 2, ..., N. The last line of the block contains just 0.The last block consists of just one line containing 0.OutputThe output contains the lines corresponding to the lines with permutations in the input.A line of the output contains Yes if it is possible to marshal the coaches in the order required on the corresponding line of the input. Otherwise it contains No. In addition,there is one empty line after the lines corresponding to one block of the input. There is no line in the output corresponding to the last ``null'' block of the input. Sample Input51 2 3 4 55 4 1 2 366 5 4 3 2 1Sample OutputYesNoYes题目四、Sliding WindowDescriptionAn array of size n≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example:The array is [1 3 -1 -3 5 3 6 7], and k is 3.Window position Minimum value Maximum value[1 3 -1] -3 5 3 6 7 -131 [3 -1 -3] 5 3 6 7 -331 3 [-1 -3 5] 3 6 7 -351 3 -1 [-3 5 3] 6 7 -351 3 -1 -3 [5 3 6] 7 361 3 -1 -3 5 [3 6 7]37Your task is to determine the maximum and minimum values in the sliding window at each position.InputThe input consists of two lines. The first line contains two integers n and k which are the lengths of the array and the sliding window. There are n integers in the second line.OutputThere are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values.Sample Input8 31 3 -1 -3 5 3 6 7Sample Output-1 -3 -3 -3 3 33 3 5 5 6 7题目五(选作考查串知识)DNA Evolution【Description】Evolution is a seemingly random process which works in a way which resembles certain approaches we use to get approximate solutions to hard combinatorial problems. You are now to do something completely different.Given a DNA string S from the alphabet {A,C,G,T}, find the minimal number of copy operations needed to create another string T. You may reverse the strings you copy, and copy both from S and the pieces of your partial T. You may put these pieces together at any time. You may only copy contiguous parts of your partial T, and all copied strings must be used in your final T.Example: From S= “ACTG” create T= “GTACTAATAAT”1.Get GT......... by copying and reversing "TG" from S.2.Get GT AC... by copying "AC" from S.3.Get GTAC TA….. by copying "TA" from the partial T.4.Get GTACTA AT by copying and reversing "TA" from the partial T.5.Get GTACTAAT AAT by copying "AAT" from the partial T.【Input】The first line of input gives a single integer, 1 ≤k≤10, the number of test cases. Then follow, for each test case, a line with the string S , length of S is less then 19, and a line with the string T , length of T is less then 19.【Output】Output for each test case the number of copy operations needed to create T from S, or "impossible" if it cannot be done.【Sample Input】4ACGTTGCAACACGTTCGATCGAAAAAAAAAAAAAAAAAAAA【Sample output】1impossible46题目六(选作考查数组知识)Magic Squares描述Following the success of the magic cube, Mr. Rubik invented its planar version, called magic squares. This is a sheet composed of 8 equal-sized squares:1 2 3 48 7 6 5In this task we consider the version where each square has a different color. Colors are denoted by the first 8 positive integers. A sheet configuration is given by the sequence of colors obtained by reading the colors of the squares starting at the upper left corner and going in clockwise direction. For instance, the configuration of Figure 3 is given by the sequence (1,2,3,4,5,6,7,8). This configuration is the initial configuration.Three basic transformations, identified by the letters `A', `B' and `C', can be applied to a sheet:∙'A': exchange the top and bottom row,∙'B': single right circular shifting of the rectangle,∙'C': single clockwise rotation of the middle four squares.Below is a demonstration of applying the transformations to the initial squares given above:A:8 7 6 51 2 3 4B:4 1 2 35 8 7 6C:1 72 48 6 3 5All possible configurations are available using the three basic transformations.You are to write a program that computes a minimal sequence of basic transformations that transforms the initial configuration above to a specific target configuration.输入A single line with eight space-separated integers (a permutation of (1..8)) that are the target configuration.输出样例输入2 6 8 4 5 73 1样例输出7BCABCCB三、实验步骤㈠、数据结构与核心算法的设计描述㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结四、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)//int IsReverse(){ ….while( (e=getchar())!='@'){e 依次入栈、入队 //push(S,e);EnQueue(Q,e);……..}While(!StackEmpty(S)) { pop(S,a);DeQueue(Q,b);If(a!=b) return 0;}return 1;}。

实验二+++栈的应用(数制转换)

实验二+++栈的应用(数制转换)

实验二栈的应用(数制转换)一、实验目的掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。

二、实验要求1.认真阅读和掌握本实验的算法。

2.上机将本算法实现。

3.保存程序的运行结果,并结合程序进行分析。

三、实验内容利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法为:1、定义栈的顺序存取结构2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)3、定义一个函数用来实现上面问题:(1)十进制整数X和R作为形参(2)初始化栈(3)只要X不为0重复做下列动作将X % R入栈, X=X/R(4)只要栈不为空重复做下列动作栈顶出栈 , 输出栈顶元素四、实验报告要求:1、十进制整数转化为R进制整数算法的代码;2、程序运行结果及分析;3、实验总结。

1.实验源码:#include"stdio.h"#include"stdlib.h"#include"malloc.h"#define maxsize 100typedef struct{int data[maxsize];int top;}seqstack,*pseqstack;pseqstack setstack(){pseqstack s;s=(pseqstack)malloc(sizeof(seqstack));if(s)s->top=-1;return s;}int empty(pseqstack s){if(s->top==-1)return 1;elsereturn 0;}pseqstack pushin(pseqstack s,int m,int r) {if(s->top==maxsize-1)printf("此栈已满,无法入栈!\n");else{while(m!=0){s->top++;s->data[s->top]=m%r;m=(m-(m%r))/r;}}return s;}int popout(pseqstack s){if(empty(s))return 0;else{printf("转化后的数是:");while(s->top!=-1){printf("%d",s->data[s->top]);s->top--;}putchar('\n');return 1;}}void main(){int m,r;pseqstack p;p=(pseqstack)malloc(sizeof(seqstack));printf("请输入一个十进制的正整数:");scanf("%d",&m);printf("请输入你想转化的进制位:");scanf("%d",&r);p=setstack();p=pushin(p,m,r);popout(p);}2.程序截图:3.实验总结:友情提示:本资料代表个人观点,如有帮助请下载,谢谢您的浏览!。

栈的实现及应用实验原理

栈的实现及应用实验原理

栈的实现及应用实验原理一、栈的实现栈是一种先进后出(FILO)的数据结构,它可以被用来实现许多算法和数据结构。

栈可以使用数组或链表来实现。

在这里,我将介绍一下基于数组的栈的实现原理。

1.1 基于数组的栈基于数组的栈实现非常简单,可以使用一个固定大小的数组来存储栈中的元素。

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

在基于数组的栈中,当一个元素压入栈时,它被放入数组的末尾(栈顶),而当一个元素弹出栈时,数组的末尾元素被移除,并返回给调用者。

1.2 实现细节在基于数组的栈中,我们需要跟踪栈顶元素的位置,通常通过一个指示栈顶索引的变量来实现。

当一个元素被压入栈时,我们将它放入数组的栈顶位置,并将栈顶索引加一;当一个元素被弹出栈时,我们将栈顶索引减一,并返回数组中当前栈顶索引位置的元素。

为了避免栈的溢出(stack overflow)或者栈的下溢(stack underflow),我们还需要处理一些边界情况。

例如,在压入元素前,我们需要检查是否数组已满;在弹出元素前,我们需要检查栈中是否有元素。

这些细节需要涵盖在栈的实现中,以保证栈的正确性和健壮性。

1.3 时间复杂度基于数组的栈的时间复杂度非常简单:压入和弹出元素的时间复杂度均为O(1),因为它们只涉及数组末尾的操作。

对于数组的访问(取得栈顶元素)的时间复杂度也为O(1)。

二、栈的应用栈是一种非常重要的数据结构,它在编程中有着广泛的应用。

以下是栈的一些应用实例:2.1 逆波兰表达式逆波兰表达式是一种不包含括号的数学表达式,它使用操作符在操作数之间排列。

逆波兰表达式的计算可以通过栈来实现。

具体地,当遇到一个操作数时,将其压入栈中;当遇到一个操作符时,弹出栈顶的两个元素,并进行相应的计算,将结果压入栈中。

这样,最终栈中剩下的元素就是逆波兰表达式的计算结果。

2.2 括号匹配在编程中,括号匹配是一个非常常见的问题。

给定一个包含括号的字符串,我们需要判断其中的括号是否匹配。

实验2栈实验报告

实验2栈实验报告

实验2 栈实验报告1. 实验目的通过本次实验,使学生了解栈的基本概念和应用,掌握栈的操作算法,培养学生的编程能力和算法思维。

2. 实验环境•编程语言:C/C++•开发工具:Visual Studio/Code/GCC•操作系统:Windows/Linux/macOS3. 实验内容本次实验主要包括以下几个方面的内容:1.实现一个简单的栈数据结构;2.实现栈的常见操作(如入栈、出栈、判空、长度等);3.利用栈解决括号匹配问题;4.利用栈实现逆波兰表达式求值;5.分析栈在函数调用中的应用。

4. 实验步骤4.1 栈的定义与实现首先,我们需要定义一个栈的数据结构。

在C/C++中,可以使用数组或链表来实现栈。

这里我们使用数组来实现。

#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;} Stack;接下来,我们需要实现栈的常见操作。

入栈(push)void push(Stack* s, int value) {if (s->top >= MAX_SIZE - 1) {printf("栈已满,无法入栈\n");return;s->data[++s->top] = value;出栈(pop)int pop(Stack* s) {if (s->top < 0) {printf("栈已空,无法出栈\n");return -1;return s->data[s->top--];判空(isEmpty)int isEmpty(Stack* s) {return s->top < 0;获取栈长度(length)int length(Stack* s) {return s->top + 1;4.2 括号匹配问题括号匹配问题是栈的一个经典应用。

栈的表示与实现及栈的应用实验报告参考模板

栈的表示与实现及栈的应用实验报告参考模板

实验二:栈的表示与实现及栈的应用【实验目的】(1) 掌握栈的顺序存储结构及其基本操作的实现。

(2) 掌握栈后进先出的特点,并利用其特性在解决实际问题中的应用。

(3) 掌握用递归算法来解决一些问题。

【实验内容】1. 编写程序,对于输入的任意一个非负十进制整数,输出与其等值的八进制数。

2. 编写递归程序,实现N !的求解。

3. 编写递归程序,实现以下函数的求解。

4. 编写程序,实现Hanoi 塔问题。

【实验步骤】1.打开VC++。

2.建立工程:点File->New ,选Project 标签,在列表中选Win32 Console Application ,再在右边的框里为工程起好名字,选好路径,点OK->finish 。

至此工程建立完毕。

3.创建源文件或头文件:点File->New ,选File 标签,在列表里选C++ Source File 。

给文件起好名字,选好路径,点OK 。

至此一个源文件就被添加到了你刚创建的工程之中。

4.写好代码5.编译->链接->调试1、#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define OK 1⎩⎨⎧>-+-==1),2()1(0,1,)(n n Fib n Fib n n n Fib#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int SElemType;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;Status InitStack(SqStack &S){S.base=(SElemType *)malloc (STACK_INIT_SIZE*sizeof(SElemType));if (!S.base) return OVERFLOW;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}//InitStackStatus 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;} //PUSHStatus Pop(SqStack &S, SElemType &e) {if(S.top==S.base)return ERROR;e=*--S.top;return OK;} //PopStatus StackEmpty(SqStack S){if (S.top==S.base)return OK;elsereturn ERROR;} //StackEmptyvoid conversion(){int N;int e;SqStack S;InitStack(S);printf("输入要转换的数据:");scanf("%d",&N);while (N){Push(S, N % 8);N = N/8;}printf("\n其对应的八进制数是:");while (!StackEmpty(S)){Pop(S,e);printf ( "%d", e );}}void main(){conversion();}2、#include <stdio.h>Int fact(int n){If(n==1)return 1;elsereturn n*fact(n-1);}void main(){Int n;printf(“输入一个数n:”);scanf(“%d”,&n);printf("fact(%d)=%d\n",n,fact(n)); }3、#include <stdio.h>int fib(int n){if(n>1)return fib(n-1)+fib(n-2);elsereturn n;}void main(){int n;printf("\n输入一个数n:");scanf("%d",&n);printf("fib(%d)=%d\n",n,fib(n));}4、#include <stdio.h>void move(char x,int n,char z){printf("将%d号盘从%c柱移到%c柱\n",n,x,z);}void hanoi (int n, char x, char y, char z) { if (n==1)move(x,1,z);else{hanoi(n-1, x, z, y);move(x, n, z);hanoi(n-1, y, x, z);}}void main(){int n;scanf("%d",&n);hanoi(n,'x','y','z');}【实验心得】这节课的实验内容是栈的表示与实现及栈的应用。

栈及其应用实验报告

栈及其应用实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

栈的实现及应用实验报告

栈的实现及应用实验报告

栈的实现及应用实验报告一、实验目的:1. 掌握栈的定义及实现方式;2. 掌握栈的基本操作;3. 了解栈的应用场景;4. 实现一个栈的数据结构,并应用到实际问题中。

二、实验原理:1. 栈的定义:栈是一种具有特殊顺序的线性表,只能在表的一端(称为栈顶)进行插入和删除操作。

栈具有"先进后出"的特性,即最后一个被插入栈的元素,是第一个被删除的元素。

2. 栈的实现方式:栈的实现方式有多种,常用的有顺序栈(使用数组实现)和链式栈(使用链表实现)。

3. 栈的基本操作:栈的基本操作包括初始化栈、判断栈是否为空、判断栈是否已满、入栈、出栈、取栈顶元素等。

4. 栈的应用场景:栈在计算机中的应用十分广泛,比如函数调用栈、表达式求值、括号匹配判断、迷宫求解、逆波兰表达式等。

三、实验步骤:1. 设计栈的数据结构:本实验选择使用链式栈实现,定义一个栈的结构体,包括栈顶指针和链表的头结点。

2. 初始化栈:创建一个空栈,即初始化栈顶指针和链表的头结点。

3. 判断栈是否为空:根据栈顶指针是否为NULL来判断栈是否为空。

4. 判断栈是否已满:链式栈一般不会满,因为链表可以动态扩展。

5. 入栈:将新元素插入到栈的顶部,通过修改指针的指向实现。

6. 出栈:将栈顶元素删除,并修改指针的指向。

7. 取栈顶元素:返回栈顶元素的值,但不删除。

8. 实现栈的应用:选择一个栈的应用场景,并实现相关功能。

四、实验结果及分析:本次实验以迷宫求解为例,来实现栈的应用。

迷宫求解问题可以使用深度优先搜索算法来解决,而栈正是深度优先搜索算法的辅助数据结构。

具体实现过程如下:1. 将迷宫的起点入栈,并将起点标记为已访问;2. 当栈不为空时,重复以下步骤:a. 取栈顶元素作为当前位置;b. 若当前位置为终点,则搜索结束;c. 若当前位置的相邻位置存在可前进的路径且未被访问过,则将该相邻位置入栈,并标记为已访问;d. 若当前位置没有可前进的路径或所有可前进的路径均已被访问过,则将当前位置出栈。

栈的运用实验报告

栈的运用实验报告

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

栈的应用实验报告

栈的应用实验报告

栈的应用实验报告导言:在计算机科学领域中,数据结构是一项非常重要的基础。

栈是一种常用的数据结构,它在算法设计和软件开发中具有广泛的应用。

本实验旨在探索栈的应用,并通过实际操作来加深对栈数据结构的理解。

实验目的:1. 了解栈的定义和基本操作。

2. 掌握栈在实际问题中的应用方法。

3. 培养问题分析和解决的能力。

实验步骤:1. 实现栈的基本操作:压入(push)和弹出(pop)。

2. 针对以下实际问题,设计并实现相应的栈应用。

一、括号匹配问题括号匹配问题是指在一个字符串中,括号的开闭配对是否正确。

例如,"{[()]}"是正确的括号匹配,而"{[(])}"则是错误的括号配对。

通过使用栈,我们可以很方便地解决这个问题。

算法步骤如下:1. 遍历字符串的每个字符。

2. 若字符是左括号,则将其压入栈中。

3. 若字符是右括号,则检查栈是否为空,若为空则配对错误;若非空,则弹出栈顶元素并检查是否与右括号匹配。

4. 遍历结束后,若栈为空,则括号匹配正确,否则匹配错误。

二、函数调用问题在计算机程序中,函数的调用和返回遵循"先进后出"的原则,即后调用的函数先返回。

栈提供了一种便捷的方式来管理函数调用和返回过程。

在实际的编程中,我们可以使用栈来存储函数的局部变量和返回地址等信息。

例如,以下是一个简单的函数调用示例:1. 函数A调用函数B。

2. 函数B在栈中保存局部变量和返回地址。

3. 函数B执行完毕后,从栈中弹出局部变量和返回地址,程序继续执行函数A。

三、逆波兰表达式求值问题逆波兰表达式是一种不使用括号来表示表达式的方法,而是通过运算符放置在操作数之后的方式来表示。

例如,表达式"2 3 +"等价于中缀表达式"2 + 3"。

利用栈,我们可以很方便地对逆波兰表达式进行求值。

算法步骤如下:1. 遍历逆波兰表达式的每个元素。

2. 若元素是操作数,则将其压入栈中。

数据结构实验报告_栈(3篇)

数据结构实验报告_栈(3篇)

第1篇一、实验目的本次实验旨在通过实际操作,加深对栈这一数据结构的理解,掌握栈的基本操作,包括初始化、入栈、出栈、取栈顶元素、判栈空等。

同时,通过实验练习,提高编程能力和问题解决能力。

二、实验内容1. 栈的定义及特点2. 栈的顺序存储结构3. 栈的链式存储结构4. 栈的基本操作5. 栈的应用实例三、实验过程1. 栈的定义及特点栈是一种后进先出(LIFO)的数据结构,它只允许在一端进行插入和删除操作。

栈的顶元素总是最后被插入的元素,也是最先被删除的元素。

2. 栈的顺序存储结构顺序存储结构是使用数组来实现栈。

定义一个数组作为栈的存储空间,同时定义一个指针top来指示栈顶元素的位置。

3. 栈的链式存储结构链式存储结构是使用链表来实现栈。

定义一个节点结构体,其中包含数据和指向下一个节点的指针。

头节点作为栈顶元素。

4. 栈的基本操作(1)初始化:创建一个空栈,top指针指向栈底。

(2)入栈:将新元素插入到栈顶。

如果栈满,则进行扩容。

(3)出栈:删除栈顶元素,并将其返回。

如果栈空,则返回错误信息。

(4)取栈顶元素:返回栈顶元素的值,但不删除栈顶元素。

(5)判栈空:判断栈是否为空,如果为空,则返回true;否则,返回false。

5. 栈的应用实例(1)括号匹配检验:利用栈判断一个字符串中的括号是否匹配。

(2)算术表达式求值:利用栈实现算术表达式求值,包括四则运算和括号。

四、实验结果与分析1. 初始化栈初始化栈后,栈为空,top指针指向栈底。

2. 入栈操作将元素1、2、3依次入栈,栈的状态如下:```top -> 3 -> 2 -> 1```3. 出栈操作依次出栈元素,栈的状态如下:```top -> 2 -> 1```4. 取栈顶元素取栈顶元素2,栈的状态不变。

5. 判栈空当栈中只有一个元素时,判断栈为空,返回false。

6. 括号匹配检验对于字符串"((()))",括号匹配检验结果为true;对于字符串"(()))",括号匹配检验结果为false。

栈的应用实验报告心得

栈的应用实验报告心得

栈的应用实验报告心得栈的应用实验报告心得一、引言栈(Stack)是一种常用的数据结构,具有先进后出(Last In First Out,简称LIFO)的特点。

在实际应用中,栈有着广泛的应用,例如函数调用、递归、表达式求值、括号匹配等。

为了更好地理解栈的应用,我们进行了一系列实验。

二、实验目的理解栈的基本概念和特点;掌握栈的基本操作,包括入栈、出栈、判空、读栈顶等;熟悉栈的应用场景,如逆波兰表达式求值、中缀表达式转后缀表达式等。

三、实验内容实现栈的基本操作:入栈、出栈、判空、读栈顶;实现逆波兰表达式求值算法;实现中缀表达式转后缀表达式算法;运用栈解决实际问题,如括号匹配等。

四、实验步骤及结果实验步骤(1)根据实验要求,设计栈的数据结构,并实现基本操作;(2)实现逆波兰表达式求值算法,通过入栈、出栈操作进行运算;(3)实现中缀表达式转后缀表达式算法,通过栈的特性进行转换;(4)运用栈解决括号匹配问题,通过入栈、出栈操作进行判断。

实验结果通过实验,我们成功实现了栈的基本操作,并运用栈解决了逆波兰表达式求值、中缀表达式转后缀表达式以及括号匹配等问题。

实验结果表明,栈在解决这些问题上具有很好的效果和应用价值。

五、实验心得通过本次实验,我对栈的概念和特点有了更深入的理解。

栈的先进后出特点使得其在很多实际问题中具有很好的应用场景。

在实现栈的过程中,我学会了如何设计栈的数据结构,并实现其基本操作。

通过实现逆波兰表达式求值算法和中缀表达式转后缀表达式算法,我进一步加深了对栈的理解,并熟悉了栈在算法中的应用。

同时,通过解决括号匹配问题,我认识到栈在实际问题中的实用性和重要性。

在实验过程中,我遇到了一些困难,如算法的设计和实现过程中的错误,以及对栈操作的理解等。

但通过努力和与同学的讨论,我逐渐克服了这些困难,并取得了较好的实验结果。

这次实验让我深刻认识到了理论与实践的关系,只有通过实际操作,才能更好地理解和应用理论知识。

栈和队列实验报告

栈和队列实验报告

栈和队列实验报告引言:计算机科学中的数据结构是解决问题的关键。

栈和队列这两种常用的数据结构,无疑在许多实际应用中起着重要的作用。

本篇报告旨在探讨栈和队列的实验结果,并展示它们的实际应用。

一、栈的实验结果及应用1. 栈的实验结果在实验中,我们设计了一个基于栈的简单计算器,用于实现基本的四则运算。

通过栈的先进后出(Last In First Out)特性,我们成功实现了表达式的逆波兰表示法,并进行了正确的计算。

实验结果表明,栈作为一个非常有效的数据结构,可以很好地处理栈内数据的存储和检索。

2. 栈的应用栈在计算机科学中有许多实际应用。

其中之一是程序调用的存储方式。

在程序调用过程中,每个函数的返回地址都可以通过栈来保存和恢复。

另一个应用是浏览器的历史记录。

浏览器中每个访问网页的URL都可以通过栈来存储,以便用户能够追溯他们之前访问的网页。

二、队列的实验结果及应用1. 队列的实验结果在实验中,我们模拟了一个简单的出租车调度系统,利用队列的先进先出(First In First Out)特性实现乘客的排队和叫车。

实验结果表明,队列作为一个具有高效性和可靠性的数据结构,能够很好地处理排队问题。

2. 队列的应用队列在许多方面都有应用。

一个常见的应用是消息队列。

在网络通信中,消息队列可以用于存储和传递信息,确保按照特定的顺序进行处理。

另一个应用是操作系统的进程调度。

操作系统使用队列来管理各个进程的执行顺序,以实现公平和高效的资源分配。

三、栈和队列的比较及选择1. 效率比较栈和队列在实际应用中的效率取决于具体问题的需求。

栈的操作更简单,仅涉及栈顶元素的插入和删除,因此具有更高的执行速度。

而队列涉及到队头和队尾元素的操作,稍复杂一些。

但是,队列在某些问题中的应用更为广泛,例如调度问题和消息传递问题。

2. 如何选择在选择栈和队列时,需要根据实际问题的性质和需求进行综合考虑。

如果问题需要追溯历史记录或按照特定顺序进行处理,则应选择栈作为数据结构。

栈队列及其应用实验报告

栈队列及其应用实验报告

一、实验目的1. 理解栈和队列的基本概念、特点及逻辑结构。

2. 掌握栈和队列的存储结构,包括顺序存储结构和链式存储结构。

3. 熟练掌握栈和队列的基本操作,如入栈、出栈、入队、出队等。

4. 分析栈和队列在实际问题中的应用,提高解决实际问题的能力。

二、实验内容1. 栈和队列的定义及特点2. 栈和队列的存储结构3. 栈和队列的基本操作4. 栈和队列的实际应用案例分析三、实验过程1. 栈和队列的定义及特点栈(Stack)是一种后进先出(Last In First Out,LIFO)的数据结构,它只允许在一端进行插入和删除操作。

栈的典型应用场景有函数调用、递归算法等。

队列(Queue)是一种先进先出(First In First Out,FIFO)的数据结构,它允许在两端进行插入和删除操作。

队列的典型应用场景有打印队列、任务队列等。

2. 栈和队列的存储结构(1)顺序存储结构栈和队列的顺序存储结构使用数组来实现。

对于栈,通常使用数组的一端作为栈顶,入栈操作在栈顶进行,出栈操作也在栈顶进行。

对于队列,通常使用数组的一端作为队首,入队操作在队尾进行,出队操作在队首进行。

(2)链式存储结构栈和队列的链式存储结构使用链表来实现。

对于栈,每个元素节点包含数据和指向下一个节点的指针。

入栈操作在链表头部进行,出栈操作在链表头部进行。

对于队列,每个元素节点包含数据和指向下一个节点的指针。

入队操作在链表尾部进行,出队操作在链表头部进行。

3. 栈和队列的基本操作(1)栈的基本操作- 入栈(push):将元素添加到栈顶。

- 出栈(pop):从栈顶删除元素。

- 获取栈顶元素(peek):获取栈顶元素,但不删除它。

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

(2)队列的基本操作- 入队(enqueue):将元素添加到队列尾部。

- 出队(dequeue):从队列头部删除元素。

- 获取队首元素(peek):获取队首元素,但不删除它。

数据结构实验报告栈及其应用docx

数据结构实验报告栈及其应用docx

引言概述:正文内容:一、栈的概念和基本特性1.1栈的定义栈是一种操作受限的线性表,只允许在一端进行插入和删除操作,该端称为栈顶,另一端称为栈底。

栈的特点是“后进先出”(LIFO,LastInFirstOut)。

1.2栈的基本操作栈包含几个基本操作,如入栈(Push)、出栈(Pop)、判空(IsEmpty)、判满(IsFull)等。

二、栈的顺序存储结构实现方式2.1顺序存储结构的定义栈的顺序存储结构是利用一组地质连续的存储单元依次存储栈中的元素。

数组可以作为栈的顺序存储结构进行实现。

2.2顺序存储结构的入栈操作入栈操作需要将新元素插入栈顶,并更新栈顶指针。

2.3顺序存储结构的出栈操作出栈操作需要删除栈顶元素,并更新栈顶指针。

三、栈的链式存储结构实现方式3.1链式存储结构的定义栈的链式存储结构是利用链表实现栈的存储结构。

每个链表节点包含存储元素的数据域和指向下一个节点的指针域。

3.2链式存储结构的入栈操作入栈操作需要创建一个新节点并插入到链表头部,并更新栈顶指针。

3.3链式存储结构的出栈操作出栈操作需要删除链表头节点,并更新栈顶指针。

四、栈的应用4.1递归算法栈常用于实现递归算法,通过将递归函数的参数和局部变量保存在栈中,实现递归函数的调用和返回。

4.2括号匹配栈可以判断表达式中的括号是否匹配,通过入栈和出栈操作进行括号的匹配过程。

4.3后缀表达式求值栈可以用来实现后缀表达式的求值过程,通过入栈和出栈操作计算后缀表达式的值。

五、总结本文详细讨论了栈的概念、特性、实现方式和应用。

通过了解栈的基本操作,我们可以更好地理解栈的原理和使用。

栈在计算机科学领域具有广泛的应用,对于实现递归算法、括号匹配和后缀表达式求值等问题都有重要作用。

对于进一步的学习和实践,我们需要深入理解栈的原理和实现方式,并能熟练运用栈解决问题。

希望本文能为读者对栈及其应用有一个清晰的认识。

栈的应用实验报告

栈的应用实验报告

栈的应用实验报告栈的应用实验报告引言:栈是一种常见的数据结构,它具有后进先出(Last In First Out,LIFO)的特点。

在计算机科学中,栈被广泛应用于各种领域,如编译器、操作系统、图形处理等。

本实验旨在通过实际应用场景,探索栈的应用。

一、栈的基本概念和操作栈是一种线性数据结构,它由一系列元素组成,每个元素都有一个前驱元素和一个后继元素。

栈的基本操作包括入栈(Push)和出栈(Pop)。

入栈将元素添加到栈的顶部,而出栈则将栈顶元素移除。

此外,栈还具有查看栈顶元素(Top)和判断栈是否为空(IsEmpty)的操作。

二、栈在表达式求值中的应用栈在表达式求值中发挥着重要作用。

例如,当我们需要计算一个数学表达式时,可以通过将表达式转换为后缀表达式,并利用栈来进行求值。

栈中存储操作数,当遇到运算符时,从栈中弹出相应数量的操作数进行计算,再将结果入栈。

通过这种方式,我们可以实现高效的表达式求值。

三、栈在函数调用中的应用栈在函数调用中也扮演着重要角色。

当我们调用一个函数时,计算机会将函数的返回地址、参数和局部变量等信息存储在栈中。

这样,当函数执行完毕后,可以从栈中恢复之前的上下文,继续执行调用函数的代码。

栈的这种特性使得递归函数的实现成为可能,同时也为程序的模块化提供了便利。

四、栈在迷宫求解中的应用栈在迷宫求解中也能发挥重要作用。

当我们需要找到从起点到终点的路径时,可以利用栈来存储当前路径上的位置。

从起点开始,我们按照某种策略选择下一个位置,并将其入栈。

如果当前位置无法继续前进,则将其出栈,并选择下一个位置。

通过不断重复这个过程,直到找到终点或者栈为空,我们就能得到迷宫的解。

五、栈在撤销和恢复操作中的应用栈在撤销和恢复操作中也能发挥重要作用。

当我们在编辑文档或者绘图时,经常需要进行撤销和恢复操作。

栈可以用来记录每次操作的状态,当用户选择撤销时,从栈中弹出最近的操作,并将文档或图形恢复到之前的状态。

通过这种方式,我们可以提供良好的用户体验,同时也方便用户进行操作的回溯。

实验2 栈及其应用

实验2 栈及其应用

实验二栈及其应用1.实验目的(1)掌握栈的特点及其描述方法。

(2)用链式存储结构实现一个栈。

(3)掌握建栈的各种等基本操作。

(4)掌握栈的几个典型应用的算法。

2.实验内容A.验证性部分(1)设计一个字符型的链栈;(2)编写进栈、出栈、显示栈中全部元素的程序;(3)编写一个把十进制整数转换成二进制数的应用程序;(4)设计一个选择式菜单,以菜单方式选择上述操作。

B.自主性实验部分(1)用键盘输入一个整数后缀表达式(操作数的范围是0~9,运算符只含+、-、*、/,而且中间不可以有空格),使用循环程序从左向右读入表达式。

(2)如果读入的是操作数,直接进入操作数栈。

(3)如果读入的是运算符,立即从操作数栈取出所需的操作数,计算操作数运算的值,并将计算结果存回操作数栈。

3.实验要求:(1)选择合适的存储结构(顺序栈或链式栈)表示栈,给出其定义。

(2)在上述存储结构上实现栈的基本操作:初始化、置栈空、入栈、出栈、取栈顶元素等。

(3)分析后缀表达式求值的算法思想,用C(或C++)语言设计程序。

(4)上机调试通过实验程序。

(5)给出具体的算法分析,包括时间复杂度和空间复杂度等。

(6)撰写实验报告。

4.实验预备知识(1)栈的定义及栈的“后进先出”的特点。

(2)栈的顺序存储与链式存储结构及栈的初始化、入栈、出栈、取栈顶等基本操作。

(3)算术表达式的三种表示形式(前缀式、中缀式、后缀式)。

5.实验环境(1)一台运行 Windows 2000/XP 操作系统的计算机(2)选用turbo c或visual c++6、实验说明(1)类型定义#define MAXSIZE 100 /*栈的最大值*/typedef struct{ElemType elem[MAXSIZE];int top;}SqStack; /*顺序栈的类型定义*/(2)注意问题①重点理解栈的算法思想,能够根据实际情况选择合适的存储结构②栈的算法是后续实验的基础(广义表、树、图、查找、排序等)7.实验用测试数据和相关结果分析:(由学生填写)8.实验总结:(由学生填写)9.参考程序参考模板A.验证性实验程序模板#include <stdio.h>#include <stdlib.h>#include “链栈.h”#define MAXLEN 100void main(){int i=1,j=1,choice,val,n;char a;linkstack *s=new linkstack;s->top=NULL;while(i){printf("\n\n");printf("\n\t\t 链栈子系统\n");printf("\n\t\t*******************************");printf("\n\t\t* 1----入栈*");printf("\n\t\t* 2----出栈*");printf("\n\t\t* 3----显示栈*");printf("\n\t\t* 4----进制转换*");printf("\n\t\t* 0----返回*");printf("\n\t\t*******************************");printf("\n\t\t 请选择(0--4):");choice=getchar();getchar();switch (choice){case '1':while(j){printf("\t\t请输入一个整数(按回车输入下一个,输入'0'结束):");scanf("%d",&val);getchar();if (val!=0)push(s,val);elsej=0;}break;case '2':if(s->top!=NULL) printf("出栈元素是:%6d\n",pop(s));break;case '3': showstack(s);break;case '4':printf("请输入待转换的数'n' 和进制'i':(n,i)\n");scanf("%d,%d",&n,&i);Conversion(i,n);break;case '0':i=0;break;default:;}if (choice=='1'||choice=='2'||choice=='3'||choice=='4'){printf("\n\t\t按回车键继续,按其它任意键返回!");a=getchar();if (a!='\xA')i=0;}}system("pause");}/*链栈头文件:链栈.h*/typedef char datatype;typedef struct stacknode{int data;struct stacknode *next;}stacknode;typedef struct{stacknode *top;}linkstack;void push(linkstack *s,int x) /*进栈*/{//请补充完善}int pop(linkstack *s) /*出栈*/{//请补充完善}void showstack(linkstack *s) /*显示栈元素*/{//请补充完善}void Conversion(int i,int n) /*进制转换*/{//请补充完善}B.自主性实验程序模板/*表达式求值程序*/#include"stdio.h"#include "stdlib.h"#include"string.h"#define MAXSIZE 100typedef char ElemType;#include "顺序栈.h"char operate(char a,char theta,char b) /*求两数a和b作θ运算的结果*/{int r;a=a-48;b=b-48;switch(theta){case '+':r=a+b;break;case '-':r=a-b;break;case '*':r=a*b;break;case '/':r=a/b;break;}return(r+48);}char precede(char theta1,char theta2) /*判断两个运算符θ1和θ2的优先关系*/{switch(theta1){case '+':case '-':{if(theta2=='+'||theta2=='-'||theta2==')'||theta2=='#')return('>');else if(theta2=='*'||theta2=='/'||theta2=='(')return('<');}case '*':case '/':{if(theta2=='+'||theta2=='-'||theta2=='*'||theta2=='/'||theta2==')'||theta2=='#')return('>');else if(theta2=='(')return('<');}case '(':{if(theta2=='+'||theta2=='-'||theta2=='*'||theta2=='/'||theta2=='(')return('<');else if(theta2==')')return('=');}case ')':{if(theta2=='+'||theta2=='-'||theta2=='*'||theta2=='/'||theta2==')'||theta2=='=')return('>');}case '=':{if(theta2=='+'||theta2=='-'||theta2=='*'||theta2=='/'||theta2=='(')return('<');else if(theta2=='=')return('=');}}}char Evaluation(char exp[20])/*返回由中缀式exp表示的算术表达式的运算结果。

关于栈的实验报告

关于栈的实验报告

关于栈的实验报告引言栈(Stack)是一种常用的数据结构,它基于后进先出(Last In First Out,LIFO)的原则,元素的插入和删除操作只能在栈顶进行。

栈具有快速插入和删除元素的特点,因此在很多应用中广泛使用。

本实验旨在通过编写一个栈的实现,探究栈的基本操作以及应用,并对栈的性能进行评估。

一、栈的实现1. 栈的定义使用数组来实现一个基本的栈结构,可以定义一个栈类`Stack`,其中包含以下属性和方法:- 属性:- `max_size`:栈的最大容量- `top`:栈顶指针- `data`:存储栈元素的数组- 方法:- `__init__(self, size)`:构造函数,初始化栈对象,参数为栈的最大容量- `is_empty(self)`:判断栈是否为空- `is_full(self)`:判断栈是否已满- `push(self, item)`:将元素压入栈顶- `pop(self)`:从栈顶弹出一个元素- `peek(self)`:返回栈顶元素- `size(self)`:返回栈的当前大小- `clear(self)`:清空栈中所有元素2. 栈的实现pythonclass Stack:def __init__(self, size):self.max_size = sizeself.top = -1self.data = [None] * sizedef is_empty(self):return self.top == -1def is_full(self):return self.top == self.max_size - 1 def push(self, item):if self.is_full():print("Stack is full.")returnself.top += 1self.data[self.top] = itemdef pop(self):if self.is_empty():print("Stack is empty.")return Noneitem = self.data[self.top]self.top -= 1return itemdef peek(self):if self.is_empty():print("Stack is empty.")return Nonereturn self.data[self.top]def size(self):return self.top + 1def clear(self):self.top = -1上述代码实现了一个基本的栈,其中使用一个列表`data` 来存储栈的元素,`top` 表示栈顶指针,初始值为-1。

数据结构实验报告(二)栈的应用

数据结构实验报告(二)栈的应用

数据结构实验报告(⼆)栈的应⽤实验说明数据结构实验⼆ 栈的实验——栈的简单应⽤⼀、实验⽬的通过本实验使学⽣了解栈的简单应⽤,熟悉栈的特性及栈在顺序存储上的操作特点,深刻理解栈的基本操作与⽤栈解决应⽤问题的关系;特别训练学⽣使⽤栈解决实际问题的能⼒,为今后⽤栈解决相关问题奠定基础。

⼆、实验内容1.编程实现对给定的⼀组括号序列判断其是否匹配正确。

要求:(1)它必须成对出现,如“(”“)”是⼀对,“[”与“]”是⼀对;(2)出现时有严格的左右关系;(3)可以以嵌套的⽅式同时出现多组多括号,但必须是包含式嵌套,不允许交叉式嵌套。

⽐如“( )”、“[([][])]”这样是正确的,“[(])”或“([()))”或 “(()]”是不正确的。

(4)将处理的括号扩展为针对“()”“[]”“{}”三类。

2.编程实现⼀个简单的⾏编辑功能:⽤户可以输⼊⼀⾏内容,并可进⾏简易编辑。

要求:(1)遇到输⼊部分内容有误时操作退格符“#”表⽰前⼀位⽆效;(2)“@”表⽰之前的内容均⽆效。

实验报告1.实现功能描述编程实现对给定的⼀组括号序列判断其是否匹配正确,将处理的括号扩展为针对“()”“[]”“{}”三类,遇到输⼊部分内容有误时操作退格符“#”表⽰前⼀位⽆效;“@”表⽰之前的内容均⽆效。

2.⽅案⽐较与选择(1)可以使⽤栈和队列来实现。

因为栈的功能⾜以完成题⽬要求,所以初步打算使⽤栈来实现。

(2)因为编写⼀个标准的栈⽐较繁琐,⽽且本题中也没有⽤到所有栈的标准操作,所以通过模拟栈来完成本题。

(3)可以使⽤数组或链表来模拟栈。

因为括号匹配只有3对,所需空间不是很⼤,⼜因为特殊操作#、@可以在数组中通过-1和赋0值实现,因此选择了数组法来模拟栈。

3.设计算法描述(1)定义3个变量,分别⽤于记录()、[]、{}的出现次数。

遇到左符号时变量++,遇到右符号时--,变量为0时表⽰空栈。

当读到#时,再往前读⼀个字符,如果是()、[]、{}中的⼀种,则对其进⾏反向运算,即遇到右符号时++,遇到左符号时--。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
B:初次遍历数组,将数组中括号内的元素入栈,同时插入相应首字母;
C:再次遍历数组,将数组元素依次入队。(小写字母直接入队;大写字母经翻译成相应字符后入队;遇到括号,将栈中保存的元素依次出栈入队)在翻译过程中,如果依旧包含大写字母,则置flag为1,否则为0。
D:将队列中元素赋值给demon[ i ]。如果此时flag=1,则再次重复C过程。直至所有元素为人类语言。
栈和队列及其应用上机实验报告
课程名称:数据结构
班级:
实验日期:
姓名:
学号:
指导教师:
实验序号:
实验成绩:
一、实验名称:魔王语言解释
二、实验目的及要求
问题描述
有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
temp=(LinkStack)malloc(sizeof(LinkStackNode));
if(temp==NULL) return FALSE;/*申请空间失败*/
temp->data1=x;
temp->next=top->next;
top->next=temp;/*修改当前栈顶指针*/
return TRUE;
break;
}
if(p1->next==NULL) break;
else p1=p1->next;
}
fclose(fp);
if((fp=fopen("mean.txt","wt"))==NULL)
{
printf("读用户信息文件错误!\n");
return;
}
while(p2)
{
if((fprintf(fp,"%c %s\n",p2->data1,p2->data2))==0)
fp=fo");
if(fp==NULL)
{
printf("\n\n含义文件不存在,请建立\n");
head->next=NULL;
return head;
}
p1=(MEAN *)malloc(sizeof(MEAN));
while(1)
{
p1=(MEAN *)malloc(sizeof(MEAN));
}
while(p3)
{
if((fprintf(fp,"%s\n",p3->data1))==0)
{
printf("写翻译结果文件错误!\n");
break;
}
if(p3->next==NULL) break;
else p3=p3->next;
}
fclose(fp);
}
void menu()/*菜单*/
if(NewNode!=NULL)
{
NewNode->data1=x;
NewNode->next=NULL;
q->rear->next=NewNode;
q->rear=NewNode;
return TRUE;
}
else return FALSE;
}
int DeleteQueue(LinkQueue *q,char *x)/*出队操作*/
{
printf("\n\n规则文件不存在,请建立\n");
head->next=NULL;
return head;
}
while(1)
{
p1=(RULE *)malloc(sizeof(RULE));
if(fscanf(fp,"%c %s\n",&p1->data1,p1->data2)==2)
{
p2->next=p1;
if(fscanf(fp,"%c %s\n",&p1->data1,p1->data2)==2)
{
p2->next=p1;
p2=p1;
}
else
{
p2->next=NULL;
free(p1);
return head;
}
}
fclose(fp);
}
RULE *append_rule(RULE *head)/*添加规则*/
{
RULE *p1,*p2;
char x,a[8];
int n;
p2=head;
while(p2->next!=NULL)
p2=p2->next;
while(n)
{
printf("请已α->β1β2β3β4...形式输入规则");
p1=(RULE *)malloc(sizeof(RULE));
flushall();
scanf("%c->%s",&x,a);
p1->data1=x;
strcpy(p1->data2,a);
p1->next=NULL;
printf("输入的规则是%c->%s",p1->data1,p1->data2);
p2->next=p1;
p2=p1;
printf("继续输入规则吗?\n1-继续0-不继续\n请选择:[ ]\b\b");
{
char data1;
char data2[20];
struct mean *next;
}MEAN;
void InitStack(LinkStack top)/*链栈的初始化*/
{
top->next=NULL;
}
int Push(LinkStack top,char x)/*进栈操作*/
{
LinkStack temp;
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;
typedef struct rule/*定义链表存储规则*/
{
char data1;
char data2[20];
struct rule *next;
}RULE;
typedef struct mean/*定义链表存储字母含义*/
p2=p1;
printf("继续输入规则吗?\n1-继续0-不继续\n请选择:[ ]\b\b");
scanf("%d",&n);
flushall();
}
return head;
}
void save_file(RULE *p1,MEAN *p2,RESULT *p3)/*将规则、含义及翻译结果存入文件*/
(1)α->β1β2…βm
(2)(θδ1δ2…δn)->θδnθδn-1…θδ1θ
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
基本要求
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
printf("\n\n\t****************请选择(0-2):[ ]\b\b");
}
LinkQueue *translate1()/*去括号*/
{
LinkQueue *q1=(LinkQueue *)malloc(sizeof(LinkQueue)),*q2=(LinkQueue *)malloc(sizeof(LinkQueue)),
(1)B-> tAdA
(2)A-> sae
三、实验环境
VisualC++ 6.0
四、实验过程
(1)以一维数组demon[ i ]表示魔王语言.
(2)魔王语言由用户输入,初始保存在demon[ i ]中.
(3)魔王语言与人类语言对应关系固化在程序中.
(4)实现过程:
A:初始,魔王语言接收后存放在demon[ i ]中.
p1=(MEAN *)malloc(sizeof(MEAN));
flushall();
scanf("%c->%s",&p1->data1,p1->data2);
p1->next=NULL;
printf("输入的含义是:%c->%s",p1->data1,p1->data2);
p2->next=p1;
}
int Pop(LinkStack top,char *x)/*出栈操作*/
{
LinkStack temp;
temp=top->next;
if(temp==NULL) return FALSE;/*栈为空*/
top->next=temp->next;
*x=temp->data1;
free(temp);/*释放存储空间*/
typedef struct result/*定义链表存储翻译结果*/
{
char data1[20];
struct result *next;
}RESULT;
typedef struct Node/*定义链队列*/
{
char data1;
struct Node *next;
相关文档
最新文档