当前位置:文档之家› Stacks and Queues栈和队列

Stacks and Queues栈和队列

数据结构考研真题 栈和队列

第3章栈和队列 一选择题 1. 对于栈操作数据的原则是()。【青岛大学 2001 五、2(2分)】 A. 先进先出 B. 后进先出 C. 后进后出 D. 不分顺序 2. 在作进栈运算时,应先判别栈是否( ① ),在作退栈运算时应先判别栈是否( ② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③ )。 为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的( ④ )分别设在这片内存空间的两端,这样,当( ⑤ )时,才产生上溢。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D. n/2 ④: A. 长度 B. 深度 C. 栈顶 D. 栈底 ⑤: A. 两个栈的栈顶同时到达栈空间的中心点. B. 其中一个栈的栈顶到达栈空间的中心点. C. 两个栈的栈顶在栈空间的某一位置相遇. D. 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底. 【上海海运学院 1997 二、1(5分)】【上海海运学院 1999 二、1(5分)】 3. 一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是()。 A. 不确定 B. n-i+1 C. i D. n-i 【中山大学 1999 一、9(1分)】 4. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是()。 A. i-j-1 B. i-j C. j-i+1 D. 不确定的 【武汉大学 2000 二、3】 5. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p 1,p 2 ,p 3 ,…,p N ,若p N 是n,则 p i 是( )。 A. i B. n-i C. n-i+1 D. 不确定 【南京理工大学 2001 一、1(1.5分)】 6. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?() A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 【北方交通大学 2001 一、3(2分)】 7. 设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。【中科院计算所2000一、10(2分)】 A. 1,2,4,3, B. 2,1,3,4, C. 1,4,3,2, D. 4,3,1,2, E. 3,2,1,4, 8. 一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是()。 A. 2 3 4 1 5 B. 5 4 1 3 2 C. 2 3 1 4 5 D. 1 5 4 3 2 【南开大学 2000 一、1】【山东大学 2001 二、4 (1分)】【北京理工大学 2000 一、2(2分)】 9. 设一个栈的输入序列是 1,2,3,4,5,则下列序列中,是栈的合法输出序列的是()。 A. 5 1 2 3 4 B. 4 5 1 3 2 C. 4 3 1 2 5 D. 3 2 1 5 4 【合肥工业大学 2001 一、1(2分)】 10. 某堆栈的输入序列为a, b,c ,d,下面的四个序列中,不可能是它的输出序列的是

实验三 栈和队列的应用

实验三栈和队列的应用 1、实验目的 (1)熟练掌握栈和队列的结构以及这两种数据结构的特点、栈与队列的基本操作。 (2)能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法; (3)熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空的判断条件和描述方法; (4)掌握栈和队列的应用; 2、实验内容 1)栈和队列基本操作实现 (1)栈的基本操作:采用顺序存储或链式存储结构(数据类型自定义),实现初始化栈、判栈是否为空、入栈、出栈、读取栈顶元素等基本操作,栈的存储结构自定义。 (2)队列的基本操作:实现循环队列或链队列的初始化、入队列、出队列、求队列中元素个数、判队列空等操作,队列的存储结构自定义。 2)栈和队列的应用 (1)利用栈的基本操作将一个十进制的正整数转换成二进制数据,并将其转换结果输出。 提示:利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法为: 十进制整数X和R作为形参 初始化栈 只要X不为0重复做下列动作 将x%R入栈 X=X/R 只要栈不为空重复做下列动作 栈顶出栈 输出栈顶元素 (2) 利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Right”,否则输出“Wrong”。

(3) 假设循环队列中只设rear(队尾)和quelen(元素个数据)来分别表示队尾元素的位置和队中元素的个数,写出相应的入队和出队程序。 (4)选作题:编写程序实现对一个输入表达式的括号配对。 3、实验步骤 (1)理解栈的基本工作原理; (2)仔细分析实验内容,给出其算法和流程图; (3)用C语言实现该算法; (4)给出测试数据,并分析其结果; (5)在实验报告册上写出实验过程。 4、实验帮助 算法为: 1) 定义栈的顺序存取结构 2) 分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等) 3) 定义一个函数用来实现上面问题: 十进制整数X和R作为形参 初始化栈 只要X不为0重复做下列动作 将X % R入栈 X=X/R 只要栈不为空重复做下列动作 栈顶出栈 输出栈顶元素 5、算法描述 (1))初始化栈S (创建一个空栈S) void initstack(sqstack *S) { S->base=(ElemType *) malloc(INITSIZE*sizeof(ElemType)); if(!S->base) exit (-1); S->top=0; /*空栈标志*/ S->stacksize = INITSIZE; } (2) 获取栈顶元素 int gettop(sqstack S,ElemType *e) //顺序钱 { if ( S.top==0 ) /* 栈空 */

禁忌搜索算法浅析

禁忌搜索算法浅析 摘要:本文介绍了禁忌搜索算法的基本思想、算法流程及其实现的伪代码。禁忌搜索算法(Tabu Search或Taboo Search,简称TS算法)是一种全局性邻域搜索算法,可以有效地解决组合优化问题,引导算法跳出局部最优解,转向全局最优解的功能。 关键词:禁忌搜索算法;组合优化;近似算法;邻域搜索 1禁忌搜索算法概述 禁忌搜索算法(Tabu Search)是由美国科罗拉多州大学的Fred Glover教授在1986年左右提出来的,是一个用来跳出局部最优的搜寻方法。在解决最优问题上,一般区分为两种方式:一种是传统的方法,另一种方法则是一些启发式搜索算法。使用传统的方法,我们必须对每一个问题都去设计一套算法,相当不方便,缺乏广泛性,优点在于我们可以证明算法的正确性,我们可以保证找到的答案是最优的;而对于启发式算法,针对不同的问题,我们可以套用同一个架构来寻找答案,在这个过程中,我们只需要设计评价函数以及如何找到下一个可能解的函数等,所以启发式算法的广泛性比较高,但相对在准确度上就不一定能够达到最优,但是在实际问题中启发式算法那有着更广泛的应用。 禁忌搜索是一种亚启发式随机搜索算法,它从一个初始可行解出发,选择一系列的特定搜索方向(移动)作为试探,选择实现让特定的目标函数值变化最多的移动。为了避免陷入局部最优解,TS搜索中采用了一种灵活的“记忆”技术,对已经进行的优化过程进行记录和选择,指导下一步的搜索方向。 TS是人工智能的一种体现,是局部领域搜索的一种扩展。禁忌搜索是在领域搜索的基础上,通过设置禁忌表来禁忌一些已经历的操作,并利用藐视准则来奖励一些优良状态,其中涉及邻域(neighborhood)、禁忌表(tabu list)、禁忌长度(tabu 1ength)、候选解(candidate)、藐视准则(candidate)等影响禁忌搜索算法性能的关键因素。迄今为止,TS算法在组合优化、生产调度、机器学习、电路设计和神经网络等领域取得了很大的成功,近年来又在函数全局优化方面得到较多的研究,并大有发展的趋势。 2禁忌搜索算法的基本思想 禁忌搜索最重要的思想是标记对应已搜索的局部最优解的一些对象,并在进一步的迭代搜索中尽量避开这些对象(而不是绝对禁止循环),从而保证对不同的有效搜索途径的探索,TS的禁忌策略尽量避免迂回搜索,它是一种确定性的局部极小突跳策略。 禁忌搜索是对局部邻域搜索的一种扩展,是一种全局逐步寻求最优算法。局部邻域搜索是基于贪婪思想持续地在当前解的邻域中进行搜索,虽然算法通用易实现,且容易理解,但搜索性能完全依赖于邻域结构和初解,尤其会陷入局部极小而无法保证全局优化型。 禁忌搜索算法中充分体现了集中和扩散两个策略,它的集中策略体现在局部搜索,即从一点出发,在这点的邻域内寻求更好的解,以达到局部最优解而结束,为了跳出局部最优解,扩散策略通过禁忌表的功能来实现。禁忌表中记下已经到达的某些信息,算法通过对禁

数据结构 习题3 栈和队列

习题3 栈和队列 3.1 单项选择题 1. 一个栈的入栈序列a,b,c,d,e,则栈的不可能的输出序列是____。 A. edcba B. decba C. dceab D. abcde 2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为____。 A. i B. n-i C. n-i+1 D. 不确定 3. 栈结构通常采用的两种存储结构是____。 A. 顺序存储结构和链式存储结构 B.散列方式和索引方式 C.链表存储结构和数组 D.线性存储结构和非线性存储结构 4. 判定一个顺序栈ST(最多元素为m)为空的条件是____。 A. top !=0 B. top= =0 C. top !=m D. top= =m-1 5. 判定一个顺序栈ST(最多元素为m)为栈满的条件是____。 A. top!=0 B. top= =0 C. top!=m D. top= =m-1 6. 栈的特点是____,队列的特点是____。 A. 先进先出 B. 先进后出 7. 向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行__ __。 (不带头结点) A.HS->next=s; B. s->next= HS->next; HS->next=s; C. s->next= HS; HS=s; D. s->next= HS; HS= HS->next; 8. 从一个栈顶指针为HS的链栈中删除一个结点时,用x保存被删结点的值,则执行__ __。(不带头结点) A. x=HS; HS= HS—>next; B. x=HS—>data; C. HS= HS—>next; x=HS—>data; D. x=HS—>data; HS= HS—>next; 9. 一个队列的数据入队序列是1,2,3,4,则队列的出队时输出序列是____ 。 A. 4,3,2,1 B. 1,2,3,4 C. 1,4,3,2 D. 3,2,4,1 10. 判定一个循环队列QU(最多元素为m)为空的条件是____。 A. rear - front= =m B. rear-front-1= =m C. front= = rear D. front= = rear+1 11. 判定一个循环队列QU(最多元素为m, m= =Maxsize-1)为满队列的条件是____。 A. ((rear- front)+ Maxsize)% Maxsize = =m B. rear-front-1= =m C. front= =rear D. front= = rear+1 12. 循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是____。 A. (rear-front+m)%m B. rear-front+1

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

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈和队列及其应用_ 一.实验目的及要求 (1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们; (2)本实验训练的要点是“栈”的观点及其典型用法; (3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); (2)应用栈的基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中的语法检查(括号的匹配)。 (5)利用栈实现表达式的求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); A.顺序储存: 代码部分: 栈" << endl; cout << " 2.出栈" << endl; cout << " 3.判栈空" << endl; cout << " 4.返回栈顶部数据" << endl; cout << " 5.栈长" << endl; cout << " 0.退出系统" << endl;

cout << "你的选择是:" ; } 链式储存: 代码部分: 栈"<>select; switch (select){ case 0:break; case 1: cout<<"push data:"; cin>>e; if(push(L,e)){

浅析ucos_II设备驱动的设计与实现

浅析uc/os_II设备驱动的设计与实现 设备驱动程序是任何操作系统的必不可少的、最保密的一个组成部分,它们实现了计算机系统所有附属设备的一个标准接口,它包含与硬件直接相关的设备驱动。从广义上说,“驱动程序”是指一些函数的集合,这些函数都能对硬件设备进行操作。驱动程序的概念在没有固定的操作系统的时候,是一个比较模糊的定义。简单地理解就是提供了一个软件到硬件(也可以是虚拟硬件)操作的函数。通常主要应该包括:设备初始化、设备的读写(输入输出)、设备的控制等信息。在μC/OS-Ⅱ下没有统一的设备驱动接口——不像windows或者linux 下通过设备文件的定义模式,所以,把一些对硬件操作是通过一般的函数来完成的,叫成“驱动程序”也不为过。 1.简介 外设驱动程序是实时内核和硬件之间的接口,是连接底层硬件和内核的纽带。 编写驱动程序模块应满足以下主要功能: ①对设备初始化; ②把数据从内核传送到硬件和从硬件读取数据; ③读取应用程序传送给设备的数据和回送应用程序请求的数据; ④监测和处理设备出现的异常。由于在μC/OS-Ⅱ下没有统一的设备驱动接口,在该操作系统中设备驱动的设计和实现主要是通过一些对硬件操作的函数来完成。 2.μC/OS-Ⅱ操作系统启动过程中的硬件初始化 基于μC/OS-II的应用系统工作时,首先把CPU初始化;接着进行操作系统初始化,主要完成任务控制块(TCB)初始化、TCB优先级表初始化、空任务的创建等;然后开始创建新任务,并可在新创建的任务中再创建其他的新任务;最后调用OSSTART()函数启动多任务调度。 当μC/OS-Ⅱ实际移植到具体的硬件平台中时,系统初始化时还要进行硬件的初始化。主函数是系统启动首先执行的一个函数,在启动μC/OS—Ⅱ之前,要屏蔽所有中断,并对全局变量初始化,防止运行出错。硬件初始化主要包括中断初始化,串口、键盘、显示等设备初始化。μC/OS—Ⅱ的初始化通过调用OSInit()函数,为OS分配任务队列、优先级状态表和准备状态表,初始化全局变量,并且创建一个空循环任务。接下来,在启动μC/OS—

数据结构练习 第三章 栈和队列

数据结构练习第三章栈和队列 一、选择题 1.栈和队列的共同特点是( )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2.向顺序栈中压入新元素时,应当()。 A.先移动栈顶指针,再存入元素 B.先存入元素,再移动栈顶指针C.先后次序无关紧要 D.同时进行 3.允许对队列进行的操作有( )。 A. 对队列中的元素排序 B. 取出最近进队的元素 C. 在队头元素之前插入元素 D. 删除队头元素 4.用链接方式存储的队列,在进行插入运算时( ). A. 仅修改头指针 B. 头、尾指针都要修改 C. 仅修改尾指针 D.头、尾指针可能都要修改 5.设用链表作为栈的存储结构则退栈操作()。 A. 必须判别栈是否为满 B. 必须判别栈是否为空 C. 判别栈元素的类型 D.对栈不作任何判别 6.设指针变量front表示链式队列的队头指针,指针变量rear表示链式队列的队尾指针,指针变量s指向将要入队列的结点X,则入队列的操作序列为()。 A.front->next=s;front=s; B. s->next=rear;rear=s; C. rear->next=s;rear=s; D. s->next=front;front=s; 7.设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为()。 A.top=top+1; B. top=top-1; C. top->next=top; D. top=top->next; 8.队列是一种()的线性表。 A. 先进先出 B. 先进后出 C. 只能插入 D. 只能删除 9.设输入序列1、2、3、…、n经过栈作用后,输出序列中的第一个元素是n,则输出序列中的第i个输出元素是()。 A. n-i B. n-1-i C. n+l -i D.不能确定 10.设输入序列为1、2、3、4、5、6,则通过栈的作用后可以得到的输出序列为()。 A. 5,3,4,6,1,2 B. 3,2,5,6,4,1 C. 3,1,2,5,4,6 D. 1,5,4,6,2,3 11.队列的删除操作是在()进行。 A.队首 B.队尾 C.队前 D.队后 12.当利用大小为N 的数组顺序存储一个栈时,假定用top = = N表示栈空,则退栈时,用()语句修改top指针。 A.top++; B.top=0; C.top--; D.top=N; 13.队列的插入操作是在()进行。

浅议Qt的事件处理机制

浅议Qt的事件处理机制 深入了解事件处理系统对于每个学习Qt人来说非常重要,可以说,Qt是以事件驱动的UI工具集。大家熟知Signals/Slots在多线程的实现也依赖于Qt的事件处理机制。 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生、分发、接受和处理事件: 1. 谁来产生事件:最容易想到的是我们的输入设备,比如键盘、鼠标产生的 keyPressEvent,keyReleaseEvent,mousePressEvent,mouseReleaseEvent事件(他们被封装成QMouseEvent和QKeyEvent),这些事件来自于底层的操作系统,它们以异步的形式通知Qt事件处理系统,后文会仔细道来。当然Qt自己也会产生很多事件,比如QObject::startTimer()会触发QTimerEvent. 用户的程序可还以自己定制事件。 2. 谁来接受和处理事件:答案是QObject。在Qt的内省机制剖析一文已经介绍QObject 类是整个Qt对象模型的心脏,事件处理机制是QObject三大职责(内存管理、内省(intropection)与事件处理制)之一。任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。

3. 谁来负责分发事件:对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver. 对于Qt GUI程序,由QApplication来负责。 接下来,将通过对代码的解析来看看QT是利用event loop从事件队列中获取用户输入事件,又是如何将事件转义成QEvents,并分发给相应的QObject处理。 [cpp]view plainc opy 1.#include 2.#include "widget.h" 3.//Section 1 4.int main(int argc, char *argv[]) 5.{ 6. QApplication app(argc, argv); 7. Widget window; // Widget 继承自QWidget 8. window.show(); 9.return app.exec(); // 进入Qpplication事件循环,见section 2 10.} 11.// Section 2: 12.int QApplication::exec() 13.{ 14.//skip codes 15.//简单的交给QCoreApplication来处理事件循环=〉section 3 16.return QCoreApplication::exec(); 17.} 18.// Section 3 19.int QCoreApplication::exec() 20.{ 21.//得到当前Thread数据 22. QThreadData *threadData = self->d_func()->threadData; 23.if (threadData != QThreadData::current()) {

栈和队列(必备)

栈和队列是操作受限的线性表,好像每本讲数据结构的数都是这么说的。有些书按照这个思路给出了定义和实现;但是很遗憾,这本书没有这样做,所以,原书中的做法是重复建设,这或许可以用不是一个人写的这样的理由来开脱。 顺序表示的栈和队列,必须预先分配空间,并且空间大小受限,使用起来限制比较多。而且,由于限定存取位置,顺序表示的随机存取的优点就没有了,所以,链式结构应该是首选。 栈的定义和实现 #ifndef Stack_H #define Stack_H #include "List.h" template class Stack : List//栈类定义 { public: void Push(Type value) { Insert(value); } Type Pop() { Type p = *GetNext(); RemoveAfter(); return p; }

Type GetTop() { return *GetNext(); } List ::MakeEmpty; List ::IsEmpty; }; #endif 队列的定义和实现 #ifndef Queue_H #define Queue_H #include "List.h" template class Queue : List//队列定义{ public: void EnQueue(const Type &value) { LastInsert(value); } Type DeQueue() {

Type p = *GetNext(); RemoveAfter(); IsEmpty(); return p; } Type GetFront() { return *GetNext(); } List ::MakeEmpty; List ::IsEmpty; }; #endif 测试程序 #ifndef StackTest_H #define StackTest_H #include "Stack.h" void StackTest_int() { cout << endl << "整型栈测试" << endl;

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

习题三栈和队列 一单项选择题 1. 在作进栈运算时,应先判别栈是否(① ),在作退栈运算时应先判别栈是否(② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D. n/2 2.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。 A 可能是2 B 一定是2 C 可能是1 D 一定是1 3. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?() A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 4.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6, s5,s1,则栈的容量至少应该是() A.2 B. 3 C. 5 D.6 5. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。 A. |top[2]-top[1]|=0 B. top[1]+1=top[2] C. top[1]+top[2]=m D. 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. 用链接方式存储的队列,在进行删除运算时()。 A. 仅修改头指针 B. 仅修改尾指针 C. 头、尾指针都要修改 D. 头、尾指针可能都要修改 9. 递归过程或函数调用时,处理参数及返回地址,要用一种称为()的数据结构。 A.队列 B.多维数组 C.栈 D. 线性表 10.设C语言数组Data[m+1]作为循环队列SQ的存储空间, front为队头指针,rear为队尾指针,则执行出队操作的语句为() A.front=front+1 B. front=(front+1)% m C.rear=(rear+1)%(m+1) D. front=(front+1)%(m+1) 11.循环队列的队满条件为 ( ) A. (sq.rear+1) % maxsize ==(sq.front+1) % maxsize; B. (sq.front+1) % maxsize ==sq.rear C. (sq.rear+1) % maxsize ==sq.front D.sq.rear ==sq.front

实验二_栈、队列地实现与应用

实验二栈、队列的实现及应用 实验课程名:数据结构与算法 专业班级:学号::

/*构造空顺序栈*/ int InitStack(SqStack *S) //InitStack() sub-function { S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if (!S->base) { printf("分配空间失败!\n"); return (ERROR); } S->top = S->base; S->stacksize = STACK_INIT_SIZE; printf("栈初始化成功!\n"); return (OK); } //InitStack() end /*取顺序栈顶元素*/ int GetTop(SqStack *S, SElemType *e) //GetTop() sub-function { if (S->top == S->base) { printf("栈为空!\n"); //if empty SqStack return (ERROR); } *e = *(S->top - 1); return (OK); } //GetTop() end /*将元素压入顺序栈*/ int Push(SqStack *S) //Push() sub-function { SElemType e; if (S->top - S->base>S->stacksize) { S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT*sizeof(SElemType))); if (!S->base) { printf("存储空间分配失败!\n"); return (ERROR); } S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } fflush(stdin);//清除输入缓冲区,否则原来的输入会默认送给变量x

浅谈c# 泛型类的应用分析

浅谈c# 泛型类的应用 本篇文章是对c#中泛型类的应用进行了详细的分析介绍,需要的朋友参考下 泛型类 泛型类封装不是特定于具体数据类型的操作。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。对大多集合类的操作,推荐使用.NET Framework 类库中所提供的类。 (1)泛型类可以继承具体类、封闭式构造、开放式构造基类。 复制代码代码如下: class BaseNode { } class BaseNodeGeneric { } // 继承具体类 class NodeConcrete : BaseNode { } //继承封闭式构造基类 //封闭式构造基类指基类类型参数指定具体类型 class NodeClosed : BaseNodeGeneric { } //继承开放式构造基类 //开放式构造基类指基类类型参数未指定 class NodeOpen : BaseNodeGeneric { } (2)基类类型参数必须在子类中指定实现。 复制代码代码如下: //正确 class Node1 : BaseNodeGeneric { } //错误 //在子类中未指定父类类型参数实现 class Node2 : BaseNodeGeneric {} //错误 //在子类中未指定父类类型参数实现 class Node3 : T {} class BaseNodeMultiple { } //正确 class Node4 : BaseNodeMultiple { } //正确

本题10分栈与队列的区别和共同点是什么队列主要

一、(本题10分)栈与队列的区别和共同点是什么?队列主要有哪两种物理实现? 答: 区别:栈在表尾进行插入和删除,具有“后进先出”的特点;队列在表尾插入,在表头删除,具有“先进先出”的特点; 共同点:栈和队列都是特殊的线性表,都是n 个数据元素的有限序列,都是数据结构的逻辑结构。 队列的物理实现:链队列和循环队列。 二、(本题10分)给出二叉树的定义,并画出具有3个结点的二叉树的所有形态。 答:所谓二叉树或者是空树,或者是如下定义的树:每个结点至多只有两棵子树,并且二叉树的子树有左右之分,其次序不能颠倒。 3个结点的二叉树的所有形态如下: 三、(本题15分)考虑下图: 1) 从顶点A 出发,求它的深度优先生成树(字母小的优先访问)。 2) 从顶点E 出发,求它的广度优先生成树(字母小的优先访问)。 3) 使用克鲁斯卡尔算法,求它的最小生成树(给出树的生成过程)。

答:深度优先生成树为: 广度优先生成树为: 最小生成树为:(因为有相同的权值,树的生成过程可能不相同) 评分标准:每小题5分。

四、(本题15分)假定一个待哈希存储的线性表为(32,75,29,63,48,94,25,46,18,70),哈希地址空间为0~12,若采用除留余数法H(K)=K % 13构造哈希函数,并使用链地址法处理冲突,试画出最后得到的哈希表,并求出平均查找长度。 解: 元素 哈希地址 查找次数 平均查找长度为(1*8+2*2)/10=1.2 评分标准: 画出哈希表得10分,平均查找长度得5分。 五、(本题15分)已知键值序列为{45,56,83,31,72,35,14,47,89,19},要求给出: (1) 按键值排列次序构造一棵二叉排序树。 (2) 在等概率的情况下,该二叉排序树查找成功的平均查找长度。 (3) 针对上述10个键值,在不同的排列次序下所构造出的不同形态的二叉排序树中, 在最坏和最好情况下,二叉排序树的高度各是多少? 解:总分为15分,每一小步5分。 (1) (2)在等概率情况下,该二叉排序树的平均检索长度是: ASL=(1+2*2+3*4+4*3)/10=29/10=2.9 (3)对于上述10个键值,在最坏情况下,每个结点(除了叶子结点)只有右孩子(或者只有左孩子),高度为10。在最好情况下,高度为└log 210┘+1=4。 六、(本题10分)设关键字序列为:49,38,66,90,75,10,20。把这些关键字调整成堆顶元素取最小值的堆(写出过程)。

栈和队列及其应用7

栈和队列及其应用 栈和队列通常用来存储程序执行期间产生的一些临时信息。这两种特殊表结构的共同特点是,只做插入和删除,不做查找,而且所有的插入和删除只在端点进行。 栈是一种特殊的表结构,满足先进后出策略(LIFO:last in first out),栈的插入和删除操作只在同一端点进行。 可以进行插入的端点叫栈顶(top),另一个端点叫栈底(bottom)。 栈的插入操作又叫进栈(push)或压栈,栈删除操作又叫退栈(pop)或出栈。 栈的结构示意图 注意:进栈和退栈可以不定期地、反复交替进行。 生活中类似栈的应用的例子:装药片的小圆桶,军用子弹卡等。 思考:假设有编号为1,2,3的3辆车,如果按照编号为1,2,3的顺序入栈,那么可能的出栈顺序有几种情况??? 栈的存储方式: 1.顺序存储 2.链式存储 栈的常见操作(顺序存储方式实现) 数组s[M]存储一个栈(M代表栈的容量),top变量指示栈顶指针(下标)。 M=6时:

进栈算法: //宏定义 #define M 6 #define EMPTY -1 void pushs(int s[],int &top) { int x,k; cout<<"请输入要进栈的元素值x="; cin>>x; if(top==M-1) { cout<< "栈已经满,进栈失败!"<

栈和队列答案

栈和队列 一选择题 1. 对于栈操作数据的原则是()。 A. 先进先出 B. 后进先出 C. 后进后出 D. 不分顺序 2. 在作进栈运算时,应先判别栈是否( ①B ),在作退栈运算时应先判别栈是否( ②A)。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③ )。为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的( ④ )分别设在这片内存空间的两端,这样,当( ⑤ )时,才产生上溢。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D. n/2 ④: A. 长度 B. 深度 C. 栈顶D. 栈底 ⑤: A. 两个栈的栈顶同时到达栈空间的中心点. B. 其中一个栈的栈顶到达栈空间的中心点. C. 两个栈的栈顶在栈空间的某一位置相遇. D. 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底. 3. 一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是()。 A. 不确定 B. n-i+1 C. i D. n-i 4. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j 个输出元素是()。 A. i-j-1 B. i-j C. j-i+1 D. 不确定的 5. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为 p1,p2,p3,…,pN,若pN 是n,则pi 是( )。 A. i B. n-i C. n-i+1 D. 不确定 6. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?() A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 7. 设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。 A. 1,2,4,3, B. 2,1,3,4, C. 1,4,3,2, D. 4,3,1,2, E. 3,2,1,4, 8. 一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是()。 A. 2 3 4 1 5 B. 5 4 1 3 2 C. 2 3 1 4 5 D. 1 5 4 3 2

离散数学在计算机学科中的应用

离散数学在计算机学科中的应用 离散数学是计算机学科中许多专业课程的先行课程,离散数学和后续课程的关系密切,它是计算机科学与技术应用与研究的有力工具,在计算机科学中应用非常广泛。 离散数学是计算机科学与技术专业许多课程,如《数据结构》、《数据库原理》、《数字逻辑》、《软件工程》、《计算机网络》、《信息安全》、《计算机图形学》、《计算机体系结构》、《算法设计与分析》、《人工智能》等必不可少的先行课程。其中《数据结构》、《数据库原理》、《计算机网络》是所有计算机专业的必修基础课程。(课程与计算机体系见附表) 离散数学与数据结构的关系 离散数学与数据结构的关系非常紧密,数据结构课程描述的的对象有四种,分别是线形结构、集合、树形结构和图结构,这些对象都是离散数学研究的内容。线形结构中的线形表、栈、队列等都是根据数据元素之间关系的不同而建立的对象,离散数学中的关系这一章就是研究有关元素之间的不同关系的内容;数据结构中的集合对象以及集合的各种运算都是离散数学中集合论研究的内容;离散数学中的树和图论的内容为数据结构中的树形结构对象和图结构对象的研究提供了很好的知识基础。

目前数据库原理主要研究的数据库类型是关系数据库。关系数据库中的关系演算和关系模型需要用到离散数学中的谓词逻辑的知识;关系数据库的逻辑结构是由行和列构成的二维表,表之间的连接操作需要用到离散数学中的笛卡儿积的知识,表数据的查询、插入、删除和修改等操作都需要用到离散数学中的关系代数理论和数理逻辑中的知识。 命题逻辑中的联结词广泛应用在大量信息的检索、逻辑运算和位运算中,例如目前大部分网页检索引擎都支持布尔检索,使用NOT、AND、OR等联结词进行检索有助于快速找到特定主题的网页;信息在计算机内都表示为0或1构成的位串,通过对位串的运算可以对信息进行处理,计算机字位的运算与逻辑中的联结词的运算规则是一致的,掌握了联结词的运算为计算机信息的处理提供了很好的知识基础。在计算机硬件设计中,使用了联结词完备集中的与非和或非,使用与非门和或非门设计逻辑线路,替代了之前的非门、与门和或门的组合,优化了逻辑线路。 谓词逻辑可以表示关系模型中的关系操作[4],用谓词逻辑表示关系操作的关系演算形式是:{s[<属性表>]│R(s)},其中R(s)指的是s用该满足的谓词,例如要查询不及格的女同学的名字,关系演算的表达式为:{s│s∈student and s。sex=’w’and s。score<60}。

数据结构实验二(栈和队列)

实验二栈和队列的基本操作及其应用 一、实验目的 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序 存储结构和链式存储结构上的实现。 二、实验内容 本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,学生 可以根据自己的情况任选一个! 题目一:回文判断(*) [问题描述] 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如 “abba”是回文,而“abab”不是回文。 [基本要求] (1)数据从键盘读入; (2)输出要判断的字符串; (3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出 “Yes”,否则输出“No”。 [测试数据] 由学生任意指定。 题目二:顺序栈和循环队列基本操作(*) [基本要求] 1、实现栈的基本操作 六项基本操作的机制是:初始化栈:init_stack(S);判断栈空:stack_empty(S);取栈顶元素:stack_top(S,x);入栈:push_stack(S,x);出栈:pop_stack(S);判断栈满:stack_full(S) 2、实现队列的基本操作 六项基本操作的机制是:初始化队列:init_queue(Q);判断队列是否为空:queue_empty(Q);取队头元素:queue_front(Q,x);入队:enqueue(Q,x);出队:outqueue(Q,x);判断队列是否为满:queue_full(Q) [测试数据]

由学生任意指定。 题目三:商品货架管理(**) [问题描述] 商店货架以栈的方式摆放商品。生产日期越近的越靠近栈底,出货时从栈顶取货。一天营业结束,如果货架不满,则需上货。入货直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。这样就需要倒货架,使生产日期越近的越靠近栈底。 [基本要求] 设计一个算法,保证每一次上货后始终保持生产日期越近的商品越靠近栈底。 [实现提示] 可以用一个队列和一个临时栈作为周转。 [测试数据] 由学生任意指定。 三、实验前的准备工作 1、掌握栈的逻辑结构和存储结构。 2、熟练掌握栈的出栈、入栈等操作。 3、掌握队列的逻辑结构和存储结构。 4、熟练掌握队列的出队、入队等操作 四、实验报告要求 1、实验报告要按照实验报告格式规范书写。 *2、写出算法设计思路。 3、实验上要写出多批测试数据的运行结果。 4、结合运行结果,对程序进行分析。 题目四:Rails(ACM训练题) Description There 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 that time. It was possible to establish only a surface track. Moreover, it turned out that the

相关主题
文本预览
相关文档 最新文档