栈和队列的基本操作

合集下载

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

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

实验二栈和队列的基本操作实现及其应用一、实验目的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;}。

第三章 栈和队列

第三章 栈和队列

栈和队列的基本操作是线性表操作的子集,是限定性(操作受限制)的数据结构。

第三章栈和队列数据结构之栈和队列23. 1 栈¾定义:是限定仅在表尾进行插入或删除操作的线性表。

(后进先出线性表LIFO)¾栈底指针(base) :是线性表的基址;¾栈顶指针(top):指向线性表最后一个元素的后面。

¾当top=base 时,为空栈。

¾基本操作:InitStack(&S), DestroyStack(&S),StackEmpty(S) , ClearStack(&S),GetTop(S ,&e), StackLength(S) ,Push(&S, e): 完成在表尾插入一个元素e.Pop(&S,&e): 完成在表尾删除一个元素。

数据结构之栈和队列3¾栈的表示和实现¾顺序栈:是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;栈满之后,可再追加栈空间即为动态栈。

¾顺序栈的结构类型定义:typedef int SElemType;typedef struct{SElemType *base; /* 栈底指针*/SElemType *top; /* 栈顶指针*/int stacksize; /* 栈空间大小*/ }SqStack;数据结构之栈和队列4¾基本算法描述¾建立能存放50个栈元素的空栈#define STACK_INIT_SIZE 50#define STACKINCREMENT 10Status InitStack_Sq(Stack &S){S.base=(SET*)malloc(STACK_INIT_SIZE *sizeof(SET)); /*为栈分配空间*/if(S.base==NULL)exit(OVERFLOW); /*存储分配失败*/ S.top=S.base;S.stacksize = STACK_INIT_SIZE;return OK; }数据结构之栈和队列5¾出栈操作算法void pop(Sqstack s,SElemType e){if(s.top= = s.base)return ERROR;else{s.top--;e= *s.top;}return OK;}出栈操作topABY topABYbase base数据结构之栈和队列6¾压栈操作算法void Push(SqStack s,SElemType e)if(s.top-s.base>= S.stacksize;) {S.base=(SET*)realloc(S,base,(S.stacksize+STACKINCREMEN T) *sizeof(SET)); /*为栈重新分配空间*/if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top=e;S.top++;}return OK; }topAB压栈操作topABebase base数据结构之栈和队列7¾栈的销毁void DestroyStack_Sq(Stack &S){ if (S.base) free(S.base);S.base=NULL;S.top=NULL;S.stacksize=0;}¾栈的清除void ClearStack_Sq(Stack &S){ S.top = S.base ;}数据结构之栈和队列8¾判断栈是否为空栈Status StackEmpty_Sq(Stack S){ if(S.top==S.base) return TRUE;else return FALSE;}¾获得栈的实际长度int StackLength_Sq(Stack S){return(abs(S.top-S.base));}数据结构之栈和队列9¾多个栈共享邻接空间两个栈共享一空间::::::top1top21m中间可用空间栈1栈2地址Base1Base 2……数据结构之栈和队列103. 3 栈与递归¾递归函数:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数。

栈和队列基本操作实验报告

栈和队列基本操作实验报告

实验二堆栈和队列基本操作的编程实现
【实验目的】
堆栈和队列基本操作的编程实现
要求:
堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。

也鼓励学生利用基本操作进行一些应用的程序设计。

【实验性质】
验证性实验(学时数:2H)
【实验内容】
内容:
把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。

可以实验一的结果自己实现数据输入、数据显示的函数。

利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。

【实验分析、说明过程】
【思考问题】
链表存储:通过链表的存储可以实现链表中任意位置的插入元素,删除任意元素,可以实现无序进出。

2.还会有数据移动吗?为什么?
答:栈的顺序存储不会有数据移动,移动的只是指向该数据地址的指针。

3.栈的主要特点是什么?队列呢?
【实验小结】 (总结本次实验的重难点及心得、体会、收获)
【附录-实验代码】。

堆栈和队列的基本操作

堆栈和队列的基本操作

堆栈和队列的基本操作堆栈(Stack)和队列(Queue)是两种经典的数据结构,用于解决各种问题。

它们都是线性数据结构,但是在实现和操作上有所不同。

堆栈是一种后进先出(Last In, First Out,LIFO)的数据结构,类似于我们日常生活中的堆盘子的行为。

最新添加的元素放在堆栈的顶部,而访问和删除元素的也是顶部的元素。

堆栈的基本操作有压栈(Push)、弹栈(Pop)、获取栈顶元素(Top)和判断是否为空栈(IsEmpty)。

压栈操作将一个元素添加到堆栈的顶部。

弹栈操作将堆栈顶部的元素移除,并返回该元素的值。

获取栈顶元素操作返回堆栈顶部的元素的值,但不从堆栈中移除。

判断是否为空栈操作检查堆栈是否为空,如果为空则返回真,否则返回假。

堆栈通常使用数组或链表来实现。

使用数组实现的堆栈称为顺序堆栈,而使用链表实现的堆栈称为链式堆栈。

顺序堆栈的优点是访问元素的时间复杂度为O(1),但是它的容量是固定的。

链式堆栈的优点是容量可以动态增长,但是访问元素的时间复杂度为O(n),其中n是堆栈中元素的个数。

队列是一种先进先出(First In, First Out,FIFO)的数据结构,类似于我们日常生活中排队的行为。

元素被添加到队列的尾部,而访问和删除元素是从队列的头部进行的。

队列的基本操作有入队(Enqueue)、出队(Dequeue)、获取队列头元素(Front)和判断是否为空队列(IsEmpty)。

入队操作将一个元素添加到队列的尾部。

出队操作将队列头部的元素移除,并返回该元素的值。

获取队列头元素操作返回队列头部的元素的值,但不从队列中移除。

判断是否为空队列操作检查队列是否为空,如果为空则返回真,否则返回假。

队列通常使用数组或链表来实现。

使用数组实现的队列称为顺序队列,而使用链表实现的队列称为链式队列。

顺序队列的优点是访问元素的时间复杂度为O(1),但是它的容量是固定的。

链式队列的优点是容量可以动态增长,但是访问元素的时间复杂度为O(n),其中n是队列中元素的个数。

栈和队列的操作实验小结

栈和队列的操作实验小结

栈和队列的操作实验小结一、实验目的本次实验旨在深入理解和掌握栈和队列这两种基本数据结构的基本操作,包括插入、删除、查找等操作,并通过实际操作加深对这两种数据结构特性的理解。

二、实验原理栈(Stack):栈是一种后进先出(Last In First Out,LIFO)的数据结构,即最后一个进入栈的元素总是第一个出栈。

在计算机程序中,栈常常被用来实现函数调用和递归等操作。

队列(Queue):队列是一种先进先出(First In First Out,FIFO)的数据结构,即第一个进入队列的元素总是第一个出队。

在计算机程序中,队列常常被用来实现任务的调度和缓冲等操作。

三、实验步骤与结果创建一个空栈和一个空队列。

对栈进行入栈(push)和出栈(pop)操作,观察并记录结果。

可以发现,栈的出栈顺序与入栈顺序相反,体现了后进先出的特性。

对队列进行入队(enqueue)和出队(dequeue)操作,观察并记录结果。

可以发现,队列的出队顺序与入队顺序相同,体现了先进先出的特性。

尝试在栈和队列中查找元素,记录查找效率和准确性。

由于栈和队列的特性,查找操作并不像在其他数据结构(如二叉搜索树或哈希表)中那样高效。

四、实验总结与讨论通过本次实验,我更深入地理解了栈和队列这两种数据结构的基本特性和操作。

在实际编程中,我可以根据需求选择合适的数据结构来提高程序的效率。

我注意到,虽然栈和队列在某些操作上可能不如其他数据结构高效(如查找),但它们在某些特定场景下具有无可替代的优势。

例如,在实现函数调用和递归时,栈的特性使得它成为最自然的选择;在实现任务调度和缓冲时,队列的特性使得它成为最佳选择。

我也认识到,不同的数据结构适用于解决不同的问题。

在选择数据结构时,我需要考虑数据的特性、操作的频率以及对时间和空间复杂度的需求等因素。

通过实际操作,我对栈和队列的实现方式有了更深入的理解。

例如,我了解到栈可以通过数组或链表来实现,而队列则可以通过链表或循环数组来实现。

信息学奥赛知识点(十二)—栈和队列

信息学奥赛知识点(十二)—栈和队列

栈和队列是信息学竞赛中经常涉及的数据结构,它们在算法和程序设计中有着广泛的应用。

掌握栈和队列的基本原理和操作方法,对于参加信息学竞赛的同学来说是非常重要的。

本文将深入探讨栈和队列的相关知识点,帮助大家更好地理解和掌握这两种数据结构。

一、栈的定义与特点栈是一种先进后出(LIFO)的数据结构,它的特点是只允许在栈顶进行插入和删除操作。

栈可以用数组或链表来实现,常见的操作包括压栈(push)、出栈(pop)、获取栈顶元素(top)等。

栈的应用非常广泛,比如在计算机程序中,函数的调用和返回值的存储就是通过栈来实现的。

二、栈的基本操作1. 压栈(push):将元素压入栈顶2. 出栈(pop):将栈顶元素弹出3. 获取栈顶元素(top):返回栈顶元素的值,但不把它从栈中移除4. 判空:判断栈是否为空5. 获取栈的大小:返回栈中元素的个数三、栈的应用1. 括号匹配:利用栈来检查表达式中的括号是否匹配2. 表达式求值:利用栈来实现中缀表达式转换为后缀表达式,并进行求值3. 迷宫求解:利用栈来实现迷宫的路径搜索4. 回溯算法:在深度优先搜索和递归算法中,通常会用到栈来保存状态信息四、队列的定义与特点队列是一种先进先出(FIFO)的数据结构,它的特点是只允许在队尾进行插入操作,在队首进行删除操作。

队列同样可以用数组或链表来实现,常见的操作包括入队(enqueue)、出队(dequeue)、获取队首元素(front)、获取队尾元素(rear)等。

队列在计算机领域也有着广泛的应用,比如线程池、消息队列等都可以用队列来实现。

五、队列的基本操作1. 入队(enqueue):将元素插入到队列的末尾2. 出队(dequeue):从队列的头部删除一个元素3. 获取队首元素(front):返回队列的头部元素的值4. 获取队尾元素(rear):返回队列的尾部元素的值5. 判空:判断队列是否为空6. 获取队列的大小:返回队列中元素的个数六、队列的应用1. 广度优先搜索算法(BFS):在图的搜索中,通常会用队列来实现BFS算法2. 线程池:利用队列来实现任务的调度3. 消息队列:在分布式系统中,常常会用队列来进行消息的传递4. 最近最少使用(LRU)缓存算法:利用队列实现LRU缓存淘汰在信息学竞赛中,栈和队列的相关题目经常出现,并且有一定的难度。

栈与队列实验报告总结

栈与队列实验报告总结

栈与队列实验报告总结实验报告总结:栈与队列一、实验目的本次实验旨在深入理解栈(Stack)和队列(Queue)这两种基本的数据结构,并掌握其基本操作。

通过实验,我们希望提高自身的编程能力和对数据结构的认识。

二、实验内容1.栈的实现:我们首先使用Python语言实现了一个简单的栈。

栈是一种后进先出(LIFO)的数据结构,支持元素的插入和删除操作。

在本次实验中,我们实现了两个基本的栈操作:push(插入元素)和pop(删除元素)。

2.队列的实现:然后,我们实现了一个简单的队列。

队列是一种先进先出(FIFO)的数据结构,支持元素的插入和删除操作。

在本次实验中,我们实现了两个基本的队列操作:enqueue(在队尾插入元素)和dequeue(从队头删除元素)。

3.栈与队列的应用:最后,我们使用所实现的栈和队列来解决一些实际问题。

例如,我们使用栈来实现一个算术表达式的求值,使用队列来实现一个简单的文本行编辑器。

三、实验过程与问题解决在实现栈和队列的过程中,我们遇到了一些问题。

例如,在实现栈的过程中,我们遇到了一个“空栈”的错误。

经过仔细检查,我们发现是因为在创建栈的过程中没有正确初始化栈的元素列表。

通过添加一个简单的初始化函数,我们解决了这个问题。

在实现队列的过程中,我们遇到了一个“队列溢出”的问题。

这是因为在实现队列时,我们没有考虑到队列的容量限制。

通过添加一个检查队列长度的条件语句,我们避免了这个问题。

四、实验总结与反思通过本次实验,我们对栈和队列这两种基本的数据结构有了更深入的理解。

我们掌握了如何使用Python语言实现这两种数据结构,并了解了它们的基本操作和实际应用。

在实现栈和队列的过程中,我们也学到了很多关于编程的技巧和方法。

例如,如何调试代码、如何设计数据结构、如何优化算法等。

这些技巧和方法将对我们今后的学习和工作产生积极的影响。

然而,在实验过程中我们也发现了一些不足之处。

例如,在实现栈和队列时,我们没有考虑到异常处理和性能优化等方面的问题。

数据结构(c语言版)第三版习题解答

数据结构(c语言版)第三版习题解答

数据结构(c语言版)第三版习题解答数据结构(C语言版)第三版习题解答1. 栈(Stack)1.1 栈的基本操作栈是一种具有特定限制的线性表,它只允许在表的一端进行插入和删除操作。

栈的基本操作有:(1)初始化栈(2)判断栈是否为空(3)将元素入栈(4)将栈顶元素出栈(5)获取栈顶元素但不出栈1.2 栈的实现栈可以使用数组或链表来实现。

以数组为例,声明一个栈结构如下:```c#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 存储栈中的元素int top; // 栈顶指针} Stack;```1.3 栈的应用栈在计算机科学中有广泛的应用,例如计算表达式的值、实现函数调用等。

下面是一些常见的栈应用:(1)括号匹配:使用栈可以检查一个表达式中的括号是否匹配。

(2)中缀表达式转后缀表达式:栈可以帮助我们将中缀表达式转换为后缀表达式,便于计算。

(3)计算后缀表达式:使用栈可以方便地计算后缀表达式的值。

2. 队列(Queue)2.1 队列的基本操作队列是一种按照先进先出(FIFO)原则的线性表,常用的操作有:(1)初始化队列(2)判断队列是否为空(3)将元素入队(4)将队头元素出队(5)获取队头元素但不出队2.2 队列的实现队列的实现一般有循环数组和链表两种方式。

以循环数组为例,声明一个队列结构如下:```c#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 存储队列中的元素int front; // 队头指针int rear; // 队尾指针} Queue;```2.3 队列的应用队列在计算机科学中也有广泛的应用,例如多线程任务调度、缓存管理等。

下面是一些常见的队列应用:(1)广度优先搜索:使用队列可以方便地实现广度优先搜索算法,用于解决图和树的遍历问题。

(2)生产者-消费者模型:队列可以用于实现生产者和消费者之间的数据传输,提高系统的并发性能。

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

《数据结构与算法》实验报告专业班级学号实验项目实验二栈和队列的基本操作。

实验目的1、掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。

2、掌握队列的基本操作:初始化队列、判队列为空、出队列、入队列等运算。

实验容题目1:进制转换。

利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法提示:1、定义栈的顺序存取结构2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)3、定义一个函数用来实现上面问题:十进制整数X和R作为形参初始化栈只要X不为0重复做下列动作将X%R入栈 X=X/R只要栈不为空重复做下列动作栈顶出栈输出栈顶元素题目2:利用队列的方式实现辉三角的输出。

算法设计分析(一)数据结构的定义1、栈的应用实现十进制到其他进制的转换,该计算过程是从低位到高位顺序产生R进制数的各个位数,而打印输出一般从高位到低位进行,恰好与计算过程相反。

因此,运用栈先进后出的性质,即可完成进制转换。

栈抽象数据结构描述typedef struct SqStack /*定义顺序栈*/{int *base; /*栈底指针*/int *top; /*栈顶指针*/int stacksize; /*当前已分配存储空间*/} SqStack;2、队列的应用由于是要打印一个数列,并且由于队列先进先出的性质,肯定要利用已经进队的元素在其出队之前完成辉三角的递归性。

即,利用要出队的元素来不断地构造新的进队的元素,即在第N行出队的同时,来构造辉三角的第N+1行,从而实现打印辉三角的目的。

队列抽象数据结构描述typedef struct SeqQueue{int data[MAXSIZE];int front; /*队头指针*/int rear; /*队尾指针*/}SeqQueue;(二)总体设计1、栈(1)主函数:统筹调用各个函数以实现相应功能int main()(2)空栈建立函数:对栈进行初始化。

int StackInit(SqStack *s)(3)判断栈空函数:对栈进行判断,若栈中有元素则返回1,若栈为空,则返回0。

int stackempty(SqStack *s)(4)入栈函数:将元素逐个输入栈中。

int Push(SqStack *s,int x)(5)出栈函数:若栈不空,则删除栈顶元素,并用x返回其值。

int Pop(SqStack *s,int x)(6)进制转换函数:将十进制数转换为R进制数int conversion(SqStack *s)2、队列(1)主函数:统筹调用各个函数以实现相应功能void main()(2)空队列建立函数:对队列进行初始化。

SeqQueue *InitQueue()(3)返回队头函数:判断队是否为空,若不为空则返回队头元素。

int QueueEmpty(SeqQueue *q)(4)入队函数:将元素逐个输入队列中。

void EnQueue(SeqQueue *q,int x)(5)出队函数:若队列不空,则删除队列元素,并用x返回其值。

int DeQueue(SeqQueue *q)(6)计算队长函数:计算队列的长度。

int QueueEmpty(SeqQueue *q)(7)输出辉三角函数:按一定格式输出辉三角。

void YangHui(int n)(三)各函数的详细设计:1、栈(1)int main()主函数定义s为栈类型调用函数建立空栈调用进制转换函数返回0值(2)int StackInit(SqStack *s) 空栈建立函数动态分配存判断分配成功并返回相应的值若成功,初始化存储空间(3)int stackempty(SqStack *s) 判断栈空函数若栈为空,返回0,否则返回1(4)int Push(SqStack *s,int x) 入栈函数比较栈中元素所占空间与已分配存储空间若栈满,追加存储空间若存储失败则返回0存储空间不够,添加增量逐个输入数据元素返回x的值(5)int Pop(SqStack *s,int x) 出栈函数如果栈为空,则返回0若栈不空,则删除栈顶元素,用x返回其值(6):int conversion(SqStack *s) 进制转换函数输入要转化的十进制数输入要转化为几进制运用求余运算改变进制数运用选择结构控制十六进制的输出方式2、队列(1)void main()主函数输入辉三角的行数调用辉三角输出函数输出辉三角(2)SeqQueue *InitQueue()空队列建立函数动态分配存建立队列并返还该队列(3)int QueueEmpty(SeqQueue *q) 返回队头函数判断队列为空,返回0若不空返回队头元素(4)void EnQueue(SeqQueue *q,int x) 入队函数判断队满若不满,逐个添加元素(5)int DeQueue(SeqQueue *q) 出队函数若头指针等于尾指针,顺序队列是空的不能做删除操作否则,删除队列用x返回出队的值(6)int QueueEmpty(SeqQueue *q) 计算队长函数头指针减尾指针,求队列长度(7)void YangHui(int n) 输出辉三角函数定义变量循环输出元素1插入1为队列队尾元素使用空格控制输出格式逐个输出队列元素,并构建下一行需输出的队列运算结果插入队尾实验测试结果及结果分析(一)测试结果(进制转换)(辉三角)(二)结果分析调试程序时,出现了许多错误。

如:有时候写的没有出现问题,但运行的结果是Press anu key to continue 。

程序肯定有错,但为什么会出现这种问题呢。

分号的忘记那还是很经常的,要加强注意。

在做表达式的计算的时候一定要注意何时入栈何时出栈,队列也是同样的。

如果如栈与出栈的情况判断不清楚就无法得出答案。

在写主函数时,如果是用void main 的形式,那么可以不用有返回值,如果是int main的话,要有返回值,既末尾要有return 语句。

实验总结1.进一步巩固了C语言的基础,尤其是指针那部分;2.通过实验加深了对栈和队列的操作方面知识的认识。

更深层次了解了栈和队列的操作特点及不同之处;3.通过实验达到了理论与实践结合的目的,提高了自己的编程能力;4.程序可能不够完善需要在学习过程中不断去完善,这需要平时的努力。

附录实验程序代码一、进制转换#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define STACK_INIT_SIZE 100 /*存储空间初始分配量*/#define STACKINCEREMENT 10 /*存储空间分配增量*/typedef struct SqStack /*定义顺序栈*/{ int *base; /*栈底指针*/int *top; /*栈顶指针*/int stacksize; /*当前已分配存储空间*/} SqStack;/*建立空栈函数*/int StackInit(SqStack *s) /*构造一个空栈*/{ s->base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));/*动态分配存*/if(!s->base) /*存储分配失败*/return 0;s->top=s->base;s->stacksize=STACK_INIT_SIZE; /*初始化存储空间*/return 1;}/*判断栈空函数*/int stackempty(SqStack *s) /*判断栈是否为空*/{ if(s->top==s->base){ return 1; }else{ return 0; }}/*入栈函数 */int Push(SqStack *s,int x) /*入栈,插入x为新的栈顶元素*/{ if(s->top-s->base>=s->stacksize) /*比较栈中元素所占空间与已分配存储空间*/ {s->base=(int *)realloc(s->base,(s->stacksize+STACKINCEREMENT)*sizeof(int)); /*栈满,追加存储空间*/if(!s->base) /*若存储失败则返回0*/return 0;s->top=s->base+s->stacksize;s->stacksize+=STACKINCEREMENT; /*存储空间不够,添加增量*/}*(s->top++)=x;/*逐个输入数据元素*/return x;}/*出栈函数*/int Pop(SqStack *s,int x)/*出栈操作*/{ if(s->top==s->base) /*如果栈为空,则返回0*/return 0;x=*--s->top;/*若栈不空,则删除栈顶元素,用x返回其值*/return x;}/*进制转换函数*/int conversion(SqStack *s){ /*将所输入的任意一个非负的十进制数转换为R进制的数*/int n,x=0,R=0;printf("输入要转化的十进制数:\n");scanf("%d",&n);printf("要转化为几进制:\n输入2代表二进制\n输入8代表八进制\n输入16代表十六进制\n");scanf("%d",&R);printf("将十进制数%d 转化为%d 进制是:\n",n,R);while(n){ Push(s,n%R);/*运用求余运算改变进制数*/ n=n/R;}while(!stackempty(s)){ x=Pop(s,x);switch(x) /*十六进制的输出方式*/{ case 10: printf("A");break;case 11: printf("B");break;case 12: printf("C");break;case 13: printf("D");break;case 14: printf("E");break;case 15: printf("F");break;default: printf("%d",x);}}printf("\n");return 0;}/*主函数*/int main(){ SqStack s; /*定义s为栈类型*/StackInit(&s);conversion(&s);return 0;}二、输出辉三角#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define MAXSIZE 10typedef struct SeqQueue/*定义队列*/{int data[MAXSIZE];int front; /*队头指针*/int rear; /*队尾指针*/}SeqQueue;/*建立空队列函数*/SeqQueue *InitQueue() /*构造一个空队列*/{SeqQueue *q;q=(SeqQueue*)malloc(sizeof(SeqQueue));/*动态分配存*/q->front=q->rear=0;return q;}/*入队函数*/void EnQueue(SeqQueue *q,int x)/*插入元素x为队列的新的队尾元素*/ {if((q->rear+1)%MAXSIZE==q->front) /*判断队满*/printf("\n顺序循环队列是满的!");else{q->data[q->rear]=x;q->rear=(q->rear+1)%MAXSIZE;}}/*出队函数*/int DeQueue(SeqQueue *q)/*若队列不空则删除队头元素,并返回其值*/ {int x;if(q->front==q->rear){printf("\n顺序队列是空的!不能做删除操作!");return 0;}x=q->data[q->front]; /*用x返回出队的值*/q->front=(q->front+1)%MAXSIZE;return x;}/*求队列长度函数*/int QueueEmpty(SeqQueue *q) /*求队列的长度*/{return(q->front-q->rear);}/*返回队头函数*/int GetHead(SeqQueue *q)/*用e返回队头元素*/{int e;if(q->front==q->rear) /*队列为空*/e=0;elsee=q->data[q->front];return e;}/*输出辉三角函数*/void YangHui(int n)/*输出辉三角*/{SeqQueue *q;int i,j,a,b;for(i=1;i<n;i++)printf(" ");printf("1\n"); /*循环输出元素1*/q=InitQueue();EnQueue(q,0);EnQueue(q,1); /*插入1为队列队尾元素*/for(j=1;j<n;j++){for(i=1;i<n-j;i++)printf(" ");EnQueue(q,0);while(t!=0); /*逐个输出队列元素,并构建下一行需输出的队列*/ {a=DeQueue(q);b=GetHead(q);if(t) printf("%5d"b);else printf("\n");EnQueue(q,a+b);}}DeQueue(q);printf("%5d",DeQueue(q));while(!QueueEmpty(q)){b=DeQueue(q);printf("%5d",b);}}/*主函数*/void main(){int n;printf("请输入辉三角的行数:\n"); scanf("%d",&n);YangHui(n);getchar();printf("\n");。

相关文档
最新文档