实验二 栈与队列操作实验题目

合集下载

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

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

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

栈和队列习题

栈和队列习题

栈和队列习题4.1 判断题(在你认为正确的题后的括号中打√,否则打X)。

(1)堆栈和队列都是特殊的线性表。

( )(2)堆栈和队列都将插入和删除操作限制在表的端点处进行。

( )(3)只允许在表的一端进行插入和删除操作的线性表称为堆栈。

( )(4)没有元素的堆栈称为空栈,空栈用不着栈顶指针。

( )(5)只要堆栈不空,就能任意删除堆栈的元素。

( )(6)堆栈允许删除的一端称为栈顶,而栈底元素是不能删除的。

( )(7)n个元素进栈的顺序一定与它们出栈的顺序相反。

( )(8)对采用链式存储结构的堆栈进行操作不必判断溢出。

( )(9)给出顺序堆栈的栈顶元素位置的指针是一个指针类型的变量。

( )(10)判断顺序堆栈是否为空的标志是top是否等于0(top为栈顶指针)。

( )(11)插入和删除操作比较简单是链接堆栈和链接队列的优点之一。

( )(12)n个元素进队的顺序与它们出队的顺序一定是相同的。

( )(13)没有任何元素的队列称为空队。

空队用不着队头指针与队尾指针。

( )(14)元素进出队列一定满足“先进先出”的规律。

( )(15)链接队列不存在溢出问题。

( )(16)在链接队列中删除一个元素是在链表的最前端进行的。

( )(17)采用循环链表作为存储结构的队列称为循环队列。

( )(18)堆栈和队列都可以用来解决递归问题。

( )(19)堆栈和队列都不适合采用散列存储方法。

( )(20)无论是顺序队列还是链接队列,插入、删除操作的时间复杂度都是O(1)。

( )4.2单项选择题。

(1)堆栈和队列的共同之处在于它们具有相同的——。

A.逻辑特性B.物理特性C.运算方法D.元素类型(2)堆栈和队列都是特殊的线性表,其特殊性在于_______。

A.它们具有一般线性表所没有的逻辑特性B.它们的存储结构比较特殊C.对它们的使用方法做了限制D.它们比一般线性表更简单(3)若5个元素的出栈序列为1,2,3,4,5,则进栈序列可能是——。

数据结构栈和队列习题及答案

数据结构栈和队列习题及答案

习题三栈和队列一单项选择题1. 在作进栈运算时,应先判别栈是否(① ),在作退栈运算时应先判别栈是否(② )。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。

①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/22.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。

A 可能是2B 一定是2C 可能是1D 一定是13. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?()A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 3 4 1 5 64.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6, s5,s1,则栈的容量至少应该是()A.2B. 3C. 5D.65. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。

A. |top[2]-top[1]|=0B. top[1]+1=top[2]C. top[1]+top[2]=mD. top[1]=top[2]6. 执行完下列语句段后,i值为:()int f(int x){ return ((x>0) ? x* f(x-1):2);}int i ;i =f(f(1));A.2 B. 4 C. 8 D. 无限递归7. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。

A. 3,2,4,1,1;(*^(+*-B. 3,2,8;(*^-C. 3,2,4,2,2;(*^(-D. 3,2,8;(*^(-8. 用链接方式存储的队列,在进行删除运算时()。

天大数据结构_实验作业二_栈(顺序栈)+队列(循环队列)

天大数据结构_实验作业二_栈(顺序栈)+队列(循环队列)

实验作业二:栈(顺序栈)和队列(循环队列)1. 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。

当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。

两个栈均从两端向中间增长。

当向第0号栈插入一个新元素时,使top[0]增1得到新的栈顶位置,当向第1号栈插入一个新元素时,使top[1]减1得到新的栈顶位置。

当top[0]+1 == top[1]时或top[0] == top[1]-1时,栈空间满,此时不能再向任一栈加入新的元素。

试定义这种双栈(Double Stack)结构的类定义,并实现判栈空、判栈满、插入、删除算法。

2. 求fibonacci数列算法,并比较。

(递归+非递归)(非递归方法可查阅其他资料)编写实习报告要求:一、需求分析二、概要设计1.抽象数据类型2.算法三、详细设计程序代码(注释)四、调试分析调试过程中所做的工作,时间复杂度等五、测试结果输入数据和输出数据示例六、说明(如果有)编程语言:C语言或C++语言实习报告提交方式:下次上机前,将实习报告(.doc)和源程序(.cpp)压缩成一个rar 文件,文件名称为学号_班级_姓名_第几次作业。

例如:3010216155_六班_张三_第二次作业.rar。

实习报告作为本课程的平时成绩。

抄袭、雷同,双方均为0分。

第一题:一、需求分析程序要求建立一个共享栈,分配一个存储空间,两个栈分别位于两头。

并实现对两个栈的插入,删除,和判断栈满和栈空。

栈的位置不同,所以要求对不同栈的插入和删除采用不同的算法。

二、概要设计1.抽象数据类型typedef struct {int *base;int *top;int stacksize;}stack;2.算法1.建立栈。

int instack(stack &s,stack &w,int length){s.base=(int *)malloc(length*sizeof(length));w.base=s.base+length;if(!s.base||!w.base) return 0;else{s.top=s.base;w.top=w.base;s.stacksize=length;w.stacksize=length;}return 1;}2.判断栈空。

数据结构练习题栈和队列

数据结构练习题栈和队列

栈和队列1 简述栈和线性表的区别。

2 简述栈和队列这两种数据结构的相同点和不同点。

3 如果进栈的元素序列为A,B,C,D,则可能得到的出栈序列有多少种?写出全部的可能序列。

4 如果进栈的元素序列为1,2,3,4,5,6,能否得到4,3,5,6,1,2和1,3,5,4,2,6的出栈序列?并说明为什么不能得到或如何得到。

5 写出下列程序段的运行结果(栈中的元素类型是char):main( ){SEQSTACK s,*p;char x, y;p = &s;initstack(p);x = ′c′; y = ′k′;push(p,x); push(p,′a′); push(p,y);x = pop(p);push(p,′t′); push(p,x);x = pop(p);push(p,′s′);while(!empty(p)){ y = pop(p);printf(″%c″,y);}printf(″%c\n″,x);}6 将一个非负十进制整数转换成二进制数,用非递归算法和递归算法来实现。

7 写一算法将一顺序栈中的元素依次取出,并打印元素值。

8 设单链表中存放着n个字符,试编一算法,判断该字符串是否有中心对称关系,例如xyzzyx,xyzyx都算是中心对称的字符串。

9 写出下列程序段的运行结果(队列中的元素类型是char):main( ){SEQQUEUE a, *q;char x, y;q = &a;x=′e′; y=′c′;initqueue(q);enqueue(q,′h′); enqueue(q,′r′); enqueue(q,y);x = dequeue(q);enqueue(q,x);x = dequeue(q);enqueue(q,′a′);while(!empty(q)){ y = dequeue(q);printf(″%c″,y);}printf(″%c\n″,x);}10 写一算法将一链队列中的元素依次取出,并打印这些元素值。

实验二 堆栈和队列基本操作的编程实现

实验二 堆栈和队列基本操作的编程实现

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

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

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

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

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

【注意事项】
1.开发语言:使用C。

2.可以自己增加其他功能。

【实验分析、说明过程】
【思考问题】
【实验小结】 (总结本次实验的重难点及心得、体会、收获)。

实验报告——栈和队列的应用

实验报告——栈和队列的应用

实验报告——栈和队列的应用第一篇:实验报告——栈和队列的应用实验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:打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。

二、程序清单//Ch3.cpp #include #include #include“ch3.h” template void LinkedQueue::makeEmpty()//makeEmpty//函数的实现{ LinkNode*p;while(front!=NULL)//逐个删除队列中的结点{p=front;front=front->link;delete p;} };template bool LinkedQueue::put_in(T&x){//提交命令函数if(front==NULL){//判断是否为空front=rear=new LinkNode;//如果为空,新结点为对头也为对尾front->data=rear->data=x;if(front==NULL)//分配结点失败return false;} else{rear->link=new LinkNode;//如不为空,在链尾加新的结点rear->link->data=x;if(rear->link==NULL)return false;rear=rear->link;} return true;};template bool LinkedQueue::carry_out()//执行命令函数 { if(IsEmpty()==true)//判断是否为空{return false;} cout<data<LinkNode*p=front;front=front->link;//删除以执行的命令,即对头修改delete p;//释放原结点return true;};void main()//主函数 { LinkedQueue q;//定义类对象char flag='Y';//标志是否输入了命令const int max=30;//一次获取输入命令的最大个数while(flag=='Y')//循环{ int i=0;char str[max];//定义存储屏幕输入的命令的数组gets(str);//获取屏幕输入的命令while(str[i]!=''){q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中i++;}for(int j=0;j<=i;j++){if(q.IsEmpty()==true)//判断是否为空,为空则说明没有可执行的命令{cout<cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备}q.carry_out();//调用执行命令的函数,将命令打印并删除}三、程序调试过程中所出现的错误无。

数据结构实验2——栈和队列实验报告

数据结构实验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;}; //判断栈是否为空private:T data[StackSize]; //定义数组int top; //栈顶指针};template <class T>void SeqStack<T>::Push(T x) //入栈操作{if(top>=StackSize-1) throw"上溢";top++;//栈顶指针上移data[top]=x;}template <class T>void SeqStack<T>::Pop()//出栈操作{if(Empty()) throw"下溢";top--;//栈顶指针下移}template <class T>bool SeqStack<T>::Judgement()//判断该位置是否合适{for(int i=0;i<top;i++)if(data[top]==data[i]||(abs(data[top]-data[i]))==(top-i))//判断是否满足任意两个皇后不在同列同一斜线return false;return true;}template <class T>void SeqStack<T>::PlaceQueen(int row) //放置皇后{for (int i=0;i<StackSize;i++){Push(i); //入栈if (Judgement())//判断位置是否合适{if (row<StackSize-1)PlaceQueen(row+1); //如果合适满足条件则放置一个皇后,递归调用else{num++;//不满足条件则到下一行Print();//输出符合条件的皇后}}Pop();//出栈}}template <class T>void SeqStack<T>::Print()//输出皇后函数{cout<<"NO."<<num<<":"<<endl; for(int i=0;i<StackSize;i++){for(int j=0;j<data[i];j++){cout<<"□";}cout<<"■";for(int j=StackSize-1;j>data[i];j--){cout<<"□";}cout<<endl;}cout<<endl;}void main(){SeqStack<int> Queen;Queen.PlaceQueen(0);cout<<"总共有"<<num<<"种摆放方法。

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

实验二栈与队列操作实验目的:(1)理解栈与队列的结构特征和运算特征,以便在实际问题背景下灵活运用。

(2)了解复杂问题的递归算法设计。

本次实验中,下列实验项目选做一。

1、顺序栈的基本操作[问题描述]设计算法,实现顺序栈的各种基本操作[基本要求](1)初始化栈s。

(2)从键盘输入10个字符以$结束,建立顺序栈。

(3)从键盘输入1个元素,执行入栈操作。

(4)将栈顶元素出栈。

(5)判断栈是否为空。

(6)输出从栈顶到栈底元素。

要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

2、链栈的基本操作[问题描述]设计算法,实现链栈的各种基本操作[基本要求](1)初始化栈s。

(2)从键盘输入10个字符以$结束,建立带头结点的链栈。

(3)从键盘输入1个元素,执行入栈操作。

(4)完成出栈操作。

(5)判断栈是否为空。

(6)输出从栈顶到栈底元素。

(7)输出链栈的长度。

要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

3、循环队列的基本操作[问题描述]设计算法,实现循环顺序队列的建立、入队、出队等操作。

[基本要求](1)从键盘输入10个字符以$结束,建立循环队列,并显示结果。

(2)从键盘输入1个元素,执行入队操作,并显示结果。

(3)将队头元素出队,并显示结果。

(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

4、只用尾指针表示的循环链表队列的综合操作[问题描述]假设以带头结点的的循环链表表示队列,并且只设一个指针指向队尾元素的结点(注意不设头指针),试编写队列初始化、入队、出队函数。

[基本要求及提示](1)首先定义链表结点类型。

(2)编写带头结点的循环链表的初始化函数,只用尾指针表示。

(3)编写入队函数、出队函数。

(4)在主函数中编写菜单(1.初始化;2.入队;3.出队;4.退出),调用上述功能函数。

5、用标志域表示队空队满状态的循环队列的综合操作[问题描述]要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。

[基本要求及提示](1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front==Q->rear,满:(Q->rear+1)%MAXSIZE==Q->front。

(2)本题不损失一个空间全部都得到利用,为此如下定义循环队列类型:Typedef struct{ QueueElementType element[MAXSIZE];int front;int rear;int tag;}SeqQueue;此时,循环队列空和满的条件分别为: Q->front==Q->rear&&tag==0 和Q->front==Q->rear&&tag==1(3)编写入队函数、出队函数。

(4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。

6、利用辅助数组进行栈的逆置[问题描述]利用辅助栈将栈中的元素逆置。

[基本要求及提示]在主函数中编写菜单(1.入栈;2.出栈;3.逆置;4.退出)调试运行程序。

7、利用辅助栈进行队列的逆置[问题描述]利用辅助栈进行队列元素逆置。

[基本要求及提示]在主函数中编写菜单(1.入队;2.出队;3.逆置;4.退出)调试运行程序。

8、Hanoi塔问题[问题描述]现在有三根相邻的柱子,标号为A,B,C。

A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动。

[基本要求及提示]Hanoi塔问题。

(要求4个盘子移动,输出中间结果)9、数制转换问题[问题描述]将十进制数N转换为d进制数。

[基本要求及提示]对于键盘输入的任意一个非负的十进制整数,打印输出与其等值的八进制数。

算法提示:十进制数N转换为d进制数,基于如下原理:即除d取余法。

例如:(1348)10=(2504)8N N div 8 N mod 81348 168 4168 21 021 2 52 0 2由于上述的计算过程是从低位到高位顺序产生的八进制数的各个数位。

而打印输出时,应从高位到低位进行,恰好和计算过程相反。

因此可以先将计算过程中得到的八进制数的各个位进栈,待相对应的八进制数的各位均产生以后,再使其按顺序出栈,并打印输出。

即得到了与输入的十进制数相对应的八进制数。

10、回文判断[问题描述及提示]编写程序,判断依次读入的一个以@为结束符的字母序列是否为回文,即是否为形如“序列1&序列2”模式。

其中序列1与序列2中都不含字符“&”,且序列2是序列1的逆序列。

例如,“a+b&b+a”属于该模式的字符序列,而“1+3&3-1”则不属于该模式。

算法提示:从左到右扫描字符序列,序列1首先进栈,然后序列1出栈并与序列2的字符依次比较。

11、括号匹配的检验[问题描述]从键盘输入任意括号序列,编程判断括号是否匹配。

假设允许有三种括号:圆括号()、方括号[]和花括号{},其嵌套的顺序随意。

如:{}(()[])或[([][])]等为正确嵌套格式,{[(])}或{(((])为不正确的格式。

[基本要求及提示]输入{2*[3+4]+(4+5)-10},输出结果“此序列括号匹配”。

输入 {[()],输出结果“此序列括号不匹配”。

算法提示:为了正确检验输入序列的括号匹配问题,要使用栈结构来实现。

(1)在检验算法中建立一个栈,读入圆括号、方括号和大括号组成的序列;(2)若是左括号直接入栈,等待同类的右括号与之匹配;若读入的是右括号,不入栈,若与当前栈顶的左括号为同类括号,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况;(3)如果序列已读尽,而栈中仍有待匹配的左括号,或读入一个右括号,而栈已空,则均属不合法情况。

(4)当输入序列与栈同时变空,则说明所有括号完全匹配。

12、表达式求值[问题描述]编程求算术表达式的值。

[基本要求及提示]程序能根据表达式中运算符的优先级处理表达式,正确输出运算结果。

简化问题,表达式中出现的操作数可用变量代替。

算法提示:(1)规定运算符的优先级。

(2)设置两个栈:OVS(运算数栈)、OPTR(运算符栈)。

(3)自左向右扫描表达式,进行如下处理:①遇到运算数,则进OVS栈;②遇到运算符,则与栈顶运算符进行优先级比较:大于(>)栈顶运算符,则将当前运算符进OPTR的栈;不大于(<=)栈顶运算符,则OPTR退栈一次,得栈顶运算符θ,将OVS栈退栈了两次,得运算数a和b,执行aθb运算,得到结果T,将T进OVS栈。

13、打印杨辉三角[问题描述]利用队列打印杨辉三角。

如图2-1所示。

11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 1图2-1 杨辉三角形[基本要求]按三角形的形式输出N=7时的杨辉三角。

14、模拟医院患者排队候诊[问题描述]患者医院看病过程:先在诊室外等候,再看病治疗。

排队过程中做两件事:患者到达诊室时将病历交给护士,排入等候的队列的尾部候诊(队尾入队);二是护士从等候的队列中取出下一个患者的病历(队头元素出队),让患者进入诊室就诊。

[基本要求及提示]在排队时,按照“先到先服务”的原则。

“患者到达”用a表示;“护士让下一位患者就诊”用n表示;“不再接收患者排队”用q表示。

(1)当有“患者到达”命令时,则执行入队操作;(2)当有“护士让下一位患者就诊”命令时,则对头元素出队,进行诊疗;(3)当有“不再接收患者排队”命令时,则队列中所有元素出队,程序结束。

(4)要求程序通过主菜单进行控制,通过选择菜单项的序号来调用各功能函数。

15、键盘输入缓冲区的问题[问题描述]有两个进程同时存在于一个程序中。

其中第一个进程在屏幕上连续显示‘A’字符,与此同时,程序不断检测是否有键盘输入,如果有,就读如用户键入的字符并保存到输入缓冲区中。

在用户输入时键入的字符不立即显示在屏幕上。

当用户渐入’;’或’,’时,第一个进程结束,第二个进程从缓冲区中依次读取用户输入的字符,并显示在屏幕上。

第二个进程结束后,程序又进入第一个进程,重新显示‘A’,同时用户又可以继续键入字符,直到用户键入‘.’时,第二个进程结束。

另外,当输入缓冲区满后,强行中止第一个进程,进入第二个进程。

[基本要求及提示](1)输入缓冲区采用循环队列模拟。

(2)首先定义循环队列类型,编写队列的基本操作函数,如初始化、判空、判满、入队、出队等。

编写主函数。

参考教材p98算法3.25。

相关文档
最新文档