DS03-栈和队列

合集下载

微机原理与接口技术习题答案

微机原理与接口技术习题答案

01-01 什么是冯.诺依曼机?(PP7)答:微型计算机的操作过程采用的是程序存储原理,这是由数学家冯.诺依曼(Jone Von Neumen)首先提出的,因此计算机常常称为冯.诺依曼机。

程序存储原理指出:用机器码指令排出的程序在执行前,首先存储于存储器中,存储器既存储程序又存储数据。

然后CPU逐条地从存储器中逐次取出一条条指令码,把指令码变成控制信号序列,控制信号发向有关的部件,控制完成指令规定的操作。

即MPU逐条地从内存储器中取出程序中的指令并执行指令规定的操作。

01-02 微处理器,微型计算机,微型计算机系统有什么联系与区别?(PP4~5)答:微处理器主要由运算器、控制器、寄存器阵列和片内总线组成;微型计算机主要由微处理器、内存储器、I/O接口电路和总线组成;微型计算机系统由微型计算机、I/O设备和各种软件组成。

微处理器不能构成独立的工作系统,它不能独立地执行程序;微型计算机是构成独立工作系统的最小配置;微机系统是用户使用计算机的基本配置。

01-04 画出微机系统框图。

(PP7)01-12 将下列十进制数转换为8位有符号二进制数。

(1)+32 (2)-12解(1):[+32]原=0010,0000B,[+32]反=0010,0000B,[+32]补=0010,0000B解(2):[-12]原=1000,1100B,[-12]反=1111,0011B,[-12]补=1111,0100B01-14 将下列二进制数转换为有符号十进制数。

(1)1000,0000B (3)1001,0010B解(1):查编码表1000,0000B=-128D解(3):1001,0010B取反+1=11101101+1=11101110B=-110D02-01 8086 CPU内部由哪两部分组成?他们的主要功能是什么?(P22~24)答:8086 CPU由总线接口部件BIU和指令执行部件EU组成。

BIU的功能:形成地址、取指令、指令排队、读/写OPR和总线控制。

磁盘调度算法的模拟实现

磁盘调度算法的模拟实现

磁盘调度算法的模拟实现磁盘调度算法是指操作系统中负责管理物理磁盘的一种算法,其主要目的是优化磁盘访问,提高磁盘效率。

常见的磁盘调度算法有FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描)、C-SCAN(循环扫描)等。

下面我将分别介绍这几种算法的模拟实现。

1.FCFS(先来先服务)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。

然后,将用户请求的磁道号加入队列中,按照先来先服务的原则进行服务,即按照队列中的请求顺序依次访问磁盘。

计算总体访问时间等信息,并输出结果。

2.SSTF(最短寻道时间优先)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。

然后,从当前磁头位置开始,找到与当前位置距离最近的请求磁道号,计算距离最小的请求所在的队列位置,并将该请求从队列中取出访问磁盘。

重复上述过程,直至队列为空。

计算总体访问时间等信息,并输出结果。

3.SCAN(扫描)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。

然后,将用户请求的磁道号加入队列中,并将队列按磁道号从小到大排序。

假设当前磁头位置为start,将磁头移动到队列中第一个比start大的磁道号,然后按照顺时针方向继续移动,直至访问队列中最大的磁道号。

然后,改变移动方向,回到队列中最小的磁道号为止。

计算总体访问时间等信息,并输出结果。

4.C-SCAN(循环扫描)算法模拟实现:首先,我们需要定义一个队列,用于存储用户请求的磁道号。

然后,将用户请求的磁道号加入队列中,并将队列按磁道号从小到大排序。

假设当前磁头位置为start,将磁头移动到队列中第一个比start大的磁道号,然后按照顺时针方向继续移动,直至访问队列中最大的磁道号,并将磁头移动到队列中最小的磁道号。

计算总体访问时间等信息,并输出结果。

以上是对于不同磁盘调度算法的简要模拟实现。

在实际应用中,还需要考虑更多的细节,如怎样处理新到的请求、队列的管理等。

微机原理题库

微机原理题库

1、微处理器主要由哪几部分组成?运算器ALU,控制器CU,内部存储器RA三部分组成2、按传送信息的不同,总线一般可分为哪三种总线?数据总线、地址总线、控制总线3、8086CPU 寄存器有哪些?8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。

(1)通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个).4、8086 CPU 常用的指令有哪些?数据传送指令,算术运算指令,移位指令,程序控制指令,串操作指令,处理器控制指令,I/O 指令,中断指令。

5、内部存储器主要分为哪两类?它们的主要区别是什么?(1)分为ROM和RAM.(2)它们之间的主要区别是:ROM在正常工作时只能读出,不能写入。

RAM则可读可写。

断电后,ROM中的内容不会丢失,RAM中的内容会丢失。

6、主机与外设之间的数据的输入/输出方式分为哪几种?程序直接控制传送方式程序中断控制方式存贮器直接存取方式7、什么是A/D 转换器,它的作用是什么?什么是D/A 转换器,它的作用是什么?A/D转换就是把模拟量转换成数字量。

这些数字量经过计算机处理后输出结果,通过D/A转换器变为电压或电流信号,送到执行机构,达到控制某种过程的目的。

8、如何将二进制转换成十进制?如何将十进制转换成二进制?二进制转十进制通用公式为:abcd.efg(2)=d*20+c*21+b*22+a*23+e*2-1+f*2-2+g*2-3(10)十进制整数转换为二进制整数采用"除2取余,逆序排列"法。

9、8086 有多少根地址线,寻址的内存容量是多少?20根,1M10、计算机的通信有哪两种基本方式?基本通讯方式:串行方式和并行方式。

11、结构化程序设计有哪几种基本的程序结构?顺序结构、循环结构、分支结构12、什么叫中断?中断向量表的作用是什么?如何设置中断向量表?中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。

成人高考微机原理与应用(考试复习资料)

成人高考微机原理与应用(考试复习资料)

1. 下列寄存器是16位的是 D 。

A、AHB、BLC、CHD、DS2.8086 CPU 中,可以存放移位指令RAR 移位次数的寄存器是 C 。

A、ALB、BLC、CLD、DL3. 芯片8253A 是 C 芯片。

A、可编程并口扩展芯片B、可编程串口扩展芯片C、可编程定时/计数芯片D、可编程中断管理芯片5.EEPROM 存储器是 A 。

A、电可擦除ROMB、紫外线可擦除ROMC、静态RAMD、动态RAM6.8K×8 的RAM 芯片的地址引脚条数是 D 条A、10B、11C、12D、137.8086 CPU 中,不可屏蔽中断是从 B 引脚引入的。

A、INTRB、NMIC、RESETD、RD8.8086 CPU 复位后,寄存器CS 的值是 C H。

A、0000B、0FFFC、FFFFD、FFF09.关于芯片8255A 的端口A 的描述正确的是 C 。

A、有1 种工作方式B、有 2 种工作方式C、有3 种工作方式D、有4 种工作方式10. EEPROM 存储器具有 D 特点。

A、数据是紫外线可擦除的B、内部数据只读不写的C、内部数据断电丢失的D、数据是电可擦除的11.8086 CPU 是 C 位微处理器A、4 位B、8 位C、16 位D、32 位12.下列寄存器可以作为8086CPU 寄存器间接寻址的是 B 。

A、AXB、BXC、CXD、DX13.8086 进行完算术运算后,若运算的结果为0,那么标志位ZF= B 。

A、0B、1C、2D、314.芯片8255A 是可编程并口扩展芯片,一片 8255A 可以将一个并行口扩展成 C 个并行口。

A、1B、2C、3D、415.1K×8 的RAM 芯片的地址引脚条数是 A 条A、10B、11C、12D、1316.8086 CPU 的中断向量表在内存00000H 至 D H。

A、0000FB、001FFC、002FFD、003FF17.下列数字中有可能是8 进制数的是 AA、73B、69C、82D、9518.8086 串操作寻址中,地址的自动变化是由 D 来控制的。

ASM2

ASM2
虚拟中断挂起位
5. 控制寄存器
31
保留,缺省为全0
31
12 11
页目录基地址寄存器
76
MC E
5 4 32 1 0
0 PSE DE TSD PVI VM CR4 E
43
0
PCD PWT
CR3
31
31
31 30 29 PG CD N
W
页故障线性地址寄存器
保留
18 17 16 AM WP
0 CR2
0 CR1
第二章 80x86计算机组织结构
主要内容:
80x86CPU结构 80x86存储器组织 80x86CPU的工作模式
2.1 8086CPU结构
一、概述 1.指令的一般执行过程:
取指令→指令译码→读取操作数 →执行指令→存放结果
开始 程序 结束
存储器中存储一系列指令
指令1 指令2 指令3
指令n
放暂时不用或需要保护的数据 常用于响应中断或子程序调用
(SS)=段基址 (SP)=栈顶偏移地址
SP又称为栈顶指针!
堆栈段示意图:
概念:
栈首
栈首:最低地址处
栈顶:当前入栈的
位置
栈底:最高地址处 64KB
栈顶
栈底
(SS):(SP) 低地址 (SS):(0000) (SS):(0001)
(SS):(SP)
ES
某操作数偏移地址=0204H 8FF00H
SS
画出各段在内存中的分布、
段首地址及操作数的物理地址
例题解答:
设操作数在数据段,则操作数的物 理地址为:
250AH ×16+0204H = 252A4H
存放运算结果的特征 只用到其中的9位:

计算机常用算法

计算机常用算法

2.3 递归法
例2-14:找出从自然数1,2,3,4……n中任取 (r<=n)个数的所 :找出从自然数 中任取r( ) 中任取 有组合
例2-15:用互递归法计算正弦和余弦函数。 :用互递归法计算正弦和余弦函数。 有关公式: 有关公式: Sin 2Ө = 2 SinӨ CosӨ Cos 2Ө = 1- 2(SinӨ)2 有关泰勒展开式: 有关泰勒展开式: Sin x = x – x3/6 Cos x = 1-x2/2 上述展开式在x很小时是很接近实际值的 但在x相对较大时 很小时是很接近实际值的。 上述展开式在 很小时是很接近实际值的。但在 相对较大时 误差很大。故通过对|x|的判断 决定使用哪种计算公式。 的判断, 误差很大。故通过对 的判断,决定使用哪种计算公式。
2.1 递推与迭代
递推与迭代的设计要素: 递推与迭代的设计要素: 迭代(或递推)表达式。 ① 迭代(或递推)表达式。 迭代(或递推)变量设计。 ② 迭代(或递推)变量设计。 迭代(或递推)初始值的选择。 ③ 迭代(或递推)初始值的选择。 迭代(或递推)终止(收敛)条件。 ④ 迭代(或递推)终止(收敛)条件。 迭代的收敛: 迭代的收敛: 如方程无解,迭代算法求出的近似值序列就不会收敛, ① 如方程无解,迭代算法求出的近似值序列就不会收敛,从 程序角度会出现“死循环”现象。 程序角度会出现“死循环”现象。 ② 方程虽然有解,但迭代公式选择不当或迭代初始近似值选 方程虽然有解, 择不合理,也会导致迭代不收敛。 择不合理,也会导致迭代不收敛。
拉菲森newton-Laphson法)求 例2-08:用切线法(牛顿 拉菲森 :用切线法(牛顿-拉菲森 法 非病态一元n次多项式全部实根 次多项式全部实根。 非病态一元 次多项式全部实根。
2.1 递推与迭代(作业与上机) 递推与迭代(作业与上机)

专升本数据结构习题

第一章绪论一、填空题1.数据是描述客观事物的数、字符以及所有能输入到计算机且能够被计算机程序加工处理的符号集合。

_________是数据的基本单位;___________是数据的最小单位。

通常被计算机加工处理的数据不是孤立无关的,而是彼此之间存在着某种联系,将这种数据间的联系称为________。

2.数据结构进行形式化定义时,可以从逻辑上认为数据结构DS是_________的集合D和D上_________的集合R所构成的二元组:DS=(D,R)。

3.已知某数据结构的二元组形式表示为:A=(D,R),D={01,02,03,04,05,06,07,08,09},R={r},r={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<03,07>,<03,08>,<03,09>}。

则此数据结构属于_____________结构。

4.一个算法的时间复杂度通常用问题规模大小的函数来表示,当一个算法的时间复杂度与问题规模n大小无关时,则表示为__________;成正比关系时,则表示为___________;成对数关系时,则表示为___________;成平方关系时,则表示为__________。

5.数据结构的逻辑结构包括_____________、树型结构和图型结构三种类型,其中树型结构和图型结构合称为_____________;数据结构的存储结构主要包括____________和____________两种类型。

6.线性结构的特点是:第一个结点_______前驱结点,其余结点有且仅有_______个前驱结点;最后一个结点_______后继结点,其余每个结点有且仅有_______个后继结点。

7.树型结构的特点是:根结点没有________结点,其余每个结点有且仅有________个前驱结点;叶子结点_________后继结点,其余结点可以有_________个后继结点。

DS博客作业02--栈和队列

DS博客作业02--栈和队列0.PTA得分截图1.本周学习总结(0-4分)1.1 总结栈和队列内容⼀.栈栈的定义栈是⼀种只能在⼀端进⾏插⼊或删除操作的线性表,俗称:后进先出。

表中允许进⾏插⼊、删除操作的⼀端称为栈顶。

栈的进栈出栈规则:1.栈顶出栈->栈底最后出栈;2.时进时出->元素未完全进栈时,即可出栈。

栈的分类:1.顺序栈利⽤⼀组地址连续的存储单元依次存放⾃栈底到栈顶的数据元素,同时附设指针 top 指⽰栈顶元素在顺序栈中的位置,附设指针 base 指⽰栈底的位置。

同样,应该采⽤可以动态增长存储容量的结构。

如果栈已经空了,再继续出栈操作,则发⽣元素下溢,如果栈满了,再继续⼊栈操作,则发⽣元素上溢。

栈底指针 base 初始为空,说明栈不存在,栈顶指针 top 初始指向 base,则说明栈空,元素⼊栈,则 top++,元素出栈,则 top--,故,栈顶指针指⽰的位置其实是栈顶元素的下⼀位(不是栈顶元素的位置)。

2.链栈其实就是链表的特殊情形,⼀个链表,带头结点,栈顶在表头,插⼊和删除(出栈和⼊栈)都在表头进⾏,也就是头插法建表和头删除元素的算法。

显然,链栈插⼊删除的效率较⾼,且能共享存储空间。

栈的基本运算InitStack(&s):初始化栈。

构造⼀个空栈s。

DestroyStack(&s):销毁栈。

释放栈s占⽤的存储空间。

StackEmpty(s):判断栈是否为空:若栈s为空,则返回真;否则返回假。

Push(&S,e):进栈。

将元素e插⼊到栈s中作为栈顶元素。

Pop(&s,&e):出栈。

从栈s中退出栈顶元素,并将其值赋给e。

GetTop(s,&e):取栈顶元素。

返回当前的栈顶元素,并将其值赋给e。

顺序栈的功能操作代码实现1.图像表⽰2.结构体定义typedef struct{ ElemType data[MaxSize];int top; //栈顶指针} Stack;typedef Stack *SqStack;3.基本运算<1>初始化栈initStack(&s)void InitStack(SqStack &s){ s=new Stack;s->top=-1;}<2>销毁栈ClearStack(&s)void DestroyStack(SqStack &s){ delete s;}<3>判断栈是否为空StackEmpty(s) bool StackEmpty(SqStack s){ return(s->top==-1);}<4>进栈Push(&s,e)bool Push(SqStack &s,ElemType e){ if (s->top==MaxSize-1)return false;s->top++; //栈顶指针增1s->data[s->top]=e;return true;}<5>出栈Pop(&s,&e)bool Pop(SqStack &s,ElemType &e){if (s->top==-1) //栈为空的情况,栈下溢出 return false;e=s->data[s->top];//取栈顶指针元素s->top--; //栈顶指针减1return true;}<6>取栈顶元素GetTop(s)bool GetTop(SqStack *s,ElemType &e) { if (s->top==-1) //栈为空的情况return false;e=s->data[s->top];return true;}4.顺序栈的四要素栈空条件:top=-1栈满条件:top=MaxSize-1进栈e操作:top++; st->data[top]=e 退栈操作:e=st->data[top]; top--;链栈的功能操作代码实现1.图像表⽰2.结构体定义typedef int ElemType;typedef struct linknode{ ElemType data; //数据域struct linknode *next; //指针域} LiNode,*LiStack3.基本运算<1>初始化栈initStack(&s)void InitStack(LiStack &s){ s=new LiNode;s->next=NULL;}<2>销毁栈ClearStack(&s)void DestroyStack(LiStack &s){ LiStack p;while (s!=NULL){ p=s;s=s->next;free(p);}}<3>判断栈是否为空StackEmpty(s)bool StackEmpty(LiStack s){return(s->next==NULL);}<4>进栈Push(&s,e)void Push(LiStack &s,ElemType e){ LiStack p;p=new LiNode;p->data=e; //新建元素e对应的节点*pp->next=s->next; //插⼊*p节点作为开始节点s->next=p;}<5>出栈Pop(&s,&e)bool Pop(LiStack &s,ElemType &e){ LiStack p;if (s->next==NULL) //栈空的情况return false;p=s->next; //p指向开始节点e=p->data;s->next=p->next; //删除*p节点free(p); //释放*p节点return true;}<6>取栈顶元素GetTop(s,e)bool GetTop(LiStack s,ElemType &e){ if (s->next==NULL) //栈空的情况return false;e=s->next->data;return true;}4.链栈的四要素栈空条件:s->next=NULL栈满条件:不考虑进栈e操作:结点插⼊到头结点后,链表头插法退栈操作:取出头结点之后结点的元素并删除之对于栈的C++模板类:stack#include<stack>1.stack<int> s:初始化栈,参数表⽰元素类型2.s.push(t):⼊栈元素t3.s.top():返回栈顶元素4.s.pop():出栈操作只是删除栈顶元素,并不返回该元素。

微机简答

第二章1、8086最大模式和最小模式的区别是什么?答:当8086MN/MX信号线接+5V是,系统处于最小工作模式,它适用于较小规模的应用。

当MN/MX线接地时,则系统工作于最大模式。

最大模式和最小模式的主要区别是外加有8288总线控制器。

最小模式下,控制总线直接从8086得到;最大模式下,通过8288对CPU 发出的控制信号进行变换和组合,以得到对存储器和I/O端口的读写信号和对锁存器8282及对数据总线收发器8286的控制信号,最大模式是多处理机模式,需要协调主处理器和协处理器的工作问题及对总线的共享控制问题。

最小模式是单处理机模式。

在最小模式下,控制信号是直接从第24~29脚送出的;最大模式下,状态信号S2、S1、S0隐含了一些控制信息,使用8288后,就可以从S2、S1、S0状态信息的组合中的到与这些控制信号相同的信息。

2、什么是总线周期、时钟周期、指令周期,总线周期和时钟周期的关系是什么?答:CPU要从存储器或输入/输出端口存取一个字节(或一个字)所需要的时间成为总线周期。

时钟周期是CPU的基本事件计量单位,它由计算机的主频决定。

从取指令到执行完毕指令所需要的时间成为指令周期。

一个基本的总线周期有4个时钟周期组成。

3、8086物理地址、偏移地址、段地址三者的关系是什么?答;物理地址等于段地址左移四位加上偏移地址。

4、8086总线接口单元有那些基本组成,执行单元有那些组成?答:总线接口由4个段地址寄存器、IP(16位的指令指针寄存器)、20位物理地址加法器和总线控制电路和6个字节的指令队列缓冲器组成。

执行单元由16位算术逻辑单元(ALU)、16位标志寄存器(FLAGS)、通用寄存器组、数据暂存寄存器和EU控制电路组成。

5、8086和8088的区别有哪些?引脚、数据线地址线、存储模式。

答:引脚:第28脚8088为IO/M,而8086为M/IO。

第34脚8088为SSO,而8086为BHE/S7。

【汇编】各种寄存器介绍

【汇编】各种寄存器介绍计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要⽤来保存操作数和运算结果等信息,从⽽节省读取操作数所需占⽤总线和访问存储器的时间。

32位CPU有4个32位的通⽤寄存器EAX、EBX、ECX和EDX。

对低16位数据的存取,不会影响⾼16位的数据。

这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相⼀致。

4个16位寄存器⼜可分割成8个独⽴的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有⾃⼰的名称,可独⽴存取。

程序员可利⽤数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。

寄存器EAX通常称为累加器(Accumulator),⽤累加器进⾏的操作可能需要更少时间。

可⽤于乘、除、输⼊/输出等操作,使⽤频率很⾼;寄存器EBX称为基地址寄存器(Base Register)。

它可作为存储器指针来使⽤;寄存器ECX称为计数寄存器(Count Register)。

在循环和字符串操作时,要⽤它来控制循环次数;在位操作中,当移多位时,要⽤CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。

在进⾏乘、除运算时,它可作为默认的操作数参与运算,也可⽤于存放I/O的端⼝地址。

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,⽽且也可作为指针寄存器,所以,这些32位寄存器更具有通⽤性。

2、变址寄存器32位CPU有2个32位通⽤寄存器ESI和EDI。

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

3、建立一个空栈s(顺序栈);
4、依次将单链表的数据入栈; 5、依次将单链表的数据出栈, 并逐个将出栈的数据存入单链 表的数据域(自前向后); 6、再输出单链表。
p=head->next;
while(!stackempty(s)) {p->data=pop(&s); p=p->next; } return (head); }
链队列
链队列类型定义: typedef struct { Qnode *front ; /*队头指针*/ Qnode *rear ; /*队尾指针*/ }LinkQueue; 结点类型定义: typedef Struct Qnode{ datatype data; /*数据域*/ Struct Qnode *next; /*指针域*/ }Qnode;
顺序栈出栈函数POP()
datatype Pop( SeqStack *S) {if(S->top==0) {printf("\nThe sequence stack is empty!"); return FALSE;} S->top--; return S->stack[S->top]; }
链栈的入栈操作和出栈操作
printf(“\n十进制数%d所对应的%d进制 数是:”,x,y);
while(!StackEmpty(s)) printf(“%d”,Pop(s));
printf(“\n”);
}
例3.5 利用一个顺序栈将利用一个顺序栈将单链表 (a1,a2,…,an)(其中n>=0)逆置为(an,an-1,…,a1)
实现方式 关键是编写入栈和出栈函数,具体实现依顺
序栈或链栈的存储结构有别而不同。
基本操作 建栈、判断栈满或栈空、入栈、出栈、
读栈顶元素值,等等。
栈 是仅在表尾进行插入、删除操作的线性表。 表尾(即 an 端)称为栈顶 /top ; 表头(即 a1 端)称为 栈底/base 例如: 栈 S= (a1 , a2 , a3 , ……….,an-1 , an )
顺序栈的入栈操作——例如用堆栈存放(A,B,C,D)
高地址M

低地址L
top A
B top A
top C B A
top
D C B A
top
核心语句:
顺序栈入栈函数PUSH()
SeqStack*Push(SeqStack*S,datatype x) {if(S->top==Maxsize) return NULL; else {S->stack[S->top]=x; S->top++; return s;}
第三章 栈和队列
栈(Stack)
栈的应用
队列(Queue)
队列的应用
3.1
定义

限定只能在表的一端进行插入和删除运算的 线性表。
逻辑结构 与线性表相同,仍为一对一( 1:1)关系。 存储结构
运算规则
用顺序栈或链栈存储均可,但以顺序栈更常见
只能在栈顶运算,且访问结点时依照后进先出 (LIFO)或先进后出(FILO)的原则。
Push (A); Push (B); Push (C); Push (D);
}
顺序栈出栈操作——例如从栈中取出‘B’
高地址M
top
D C B A D top C B A D C B A top D C B A
top
低地址L
核心语句: Pop ( ); Pop ( ); Printf( Pop () );
p->data=x; p->next=top;
top=p; return top; }
链栈出栈操作
LinkStack *Pop( LinkStack *top) { LinkStack *q; if(!top) {printf("\n链栈是空的!");return NULL;} q=top; top=top->next; free(q);
datatype GetTop(SeqStack *S)
{if (S->top==0)
{printf("\n栈是空的!"); return FALSE;}
else
return S->stack[S->top-1]; }
判别空栈
int StackEmpty(SeqStack *S)
{if(S->top==0) return TRUE; else return FALSE; }
队列定义 逻辑结构 存储结构 运算规则 实现方式
尾部插 入 只能在表的一端进行插入运算,在表的另一 端进行删除运算的线性表。 首部删 与线性表相同,仍为一对一关系。 除 顺序队或链队,以循环顺序队更常见。 只能在队首和队尾运算,且访问结点时依照 先进先出(FIFO)的原则。 关键是掌握入队和出队操作,具体实现依顺 序队或链队的不同而不同。
问:为什么要设计队列?它有什么独特用途?
答:
1.离散事件的模拟(模拟事件发生的先后顺序,例如 CPU芯片中的 指令译码队列); 2.操作系统中的作业调度(一个CPU执行多个作业);
3.简化程序设计。
队的实现方式是本节重点,关键是掌握入队和出队操作。 具体实现依存储结构(链队或顺序队)的不同而不同。
压入(PUSH): S[top++]=an+1 弹出( POP) : e=S[--top]
顺序栈存储结构的描述:
#define Maxsize 100
况而修改*/ /*设顺序栈的最大长度为100,可依实现情
typedef int datatype; typedef struct { datatype stack[Maxsize]; int top; /*栈顶指针*/ }SeqStack; /*顺序栈类型定义*/ SeqStack *s; /*s为顺序栈类型变量的指针*/
void conversion(int N, int r)
解题思路如下:
1 、 当 N≠0 , 将 N%r 压 入栈s中; 2、用N/r代替N; 3、若N>0,则重复 (1)、(2);若N=0, 则将栈s的内容依次出 栈。
{ int x=N,y=r; SeqStack *s; s=InitStack(); while(N!=0) { Push(s, N %r ); N=N/r ; }
a1称为栈底元素 强调:插入和删除都只能在表 的一端(栈顶)进行! 插入元素到栈顶的操作,称为入栈。
an称为栈顶元素
从栈顶删除最后一个元素的操作,称为出栈。
栈的基本操作
• ClearStack(S): 清除栈S中的所有元素 • InitStack(S): 构造一个空栈S • StackEmpty(S): 判 断 栈S 是 否 为 空, 若 为 空, 则 返 回 true;否则返回false • GetTop(S) : 返回S的栈顶元素,但不移动栈顶指针
链队的几种状态示意图:
修改rear指针 此时,front==rear
修改头结点的 指针域
① 空链队的特征?front==rear ② 链队会满吗? 一般不会,因为删除时有free动作。除非内存不足!
③ 怎样实现链队的入队和出队操作? 若设S所指结点为入队结点
入队(尾部插入):rear->next=S; rear=S; 出队(头部删除):front->next=p->next;
struct node * next; }LinkStack; LinkStack *top;
将x入栈,修改栈 顶指针:top=p
an出栈,修改栈顶指 针:top=top->next
链栈入栈操作
LinkStack *Push((LinkStack *top,datatype x)
{ LinkStack *p; p=( Linkstack *)malloc(sizeof(LinkStack));
构造一个空链队操作
LinkQueue *InitQueue()
{ LinkQueue *q; Qnode *p;
Q=(LinkQueue*)malloc(sizeof(LinkQueue));
p=(Qnode*)malloc(sizeof(Qnode)); p->next=NULL; q->front =q->rear=p;
linklist*backlinklist(linklist *head)
解题思路如下:
1、建立一个带头结点的单链表 head; 2、输出该单链表;

{linklist *p; p=head->next; initstack(); while(p) {push(&s, p->data); p=p->next ; }
1. 链队列
2.
顺序队
(1)InitQueue (Q): 构造一个空队列Q (2)QueueEmpty (Q): 判断队列是否为空 (3)QueueLength (Q): 求队列的长度 (4)GetHead (Q): 返回Q的队头元素,不改变队列状态 (5)EnQueue(Q, x ): 插入元素x为Q的新的队尾元素 (6)DeQueue(Q): 删除Q的队头元素 (7)ClearQueue(Q):清除队列Q中的所有元素
3.3
队列
基本操作:入队或出队,建空队列,判队空或队满等操作。
队列 (Queue)是仅在表尾进行插入操作,在表头进行删除 操作的线性表。它是一种先进先出(FIFO)的线性表。 例如:队列 Q= (a1 , a2 , a3
队首
, ……….,an-1 ,
an )
队尾
在队尾插入元素称为入队;在队首删除元素称为出队。
相关文档
最新文档