第3章 栈和上机作业.

合集下载

C++第三章习题解答

C++第三章习题解答
多文件结构管理程序的好处是十分明显的。首先,可以避免重复性的编译,如果修改了个别函数,那么只需将这些函数所在的文件重新编译即可;其次,将程序进行合理的功能划分后,更容易设计、调试和维护;另外,通常把相关函数放在一个文件中,这样形成一系列按照功能分类的文件,便于为其他程序文件使用。
3.2.6 宏定义与常量定义从作用及效果上看是一样的,二者是否完全相同?
(1)
#include<iostream>
using namespace std;
int a,b;
void f(int j){
static int i=a; //注意静态局部变量
int m,n;
m=i+j; i++; j++; n=i*j; a++;
cout<<"i="<<i<<'\t'<<"j="<<j<<'\t';
答案:
(1)全局数据区
(2)编译
(3)全局生存期
(4)全0
3.1.4局部变量存储在 (1) 区,在 (2) 时候建立,生存期为(3) ,如定义时未显式初始化,则其初值为 (4) 。
答案:
(1)栈
(2)在函数或块开始执行时
(3)函数或块的执行期
(4)随机值
3.1.5 编译预处理的作用是 (1) ,预处理指令的标志是 (2) 。多文件系统中,程序由 (3) 来管理,用户自定义头文件中通常定义一些 (4) 。
else return ch;
}
int main(){

第三章 栈

第三章 栈

S
∧ base
进栈算法
int lpush(Lstack s, int e)
{
S
e P
p=(Lstack)malloc(sizeof(lnode));
p->data=e; p->next=s; s=p; return (1); }
S
∧ base
2.3.1.3 栈的应用
(1) 过程的嵌套
主 程 序 r 子 程 序 1 s r 子 程 序 2
S
∧ base
进栈算法
int lpush(Lstack s, int e)
{
P p=(Lstack)malloc(sizeof(lnode));
p->data=e; S
p->next=s;
s=p; return (1); }
∧ base
进栈算法
int lpush(Lstack s, int e)
4 3 2
栈s
top a4 a3 a2 a1
else { - -top;
*py=s[top]; /*返回出栈元素*/
1
0
*ptop=top;
return(1);}}
(2)链栈
用指针来实现的栈叫链栈。栈的容量事先不能 估计时采用这种存储结构。 链栈的类型说明如下:
Typedef struct lnode
(c) 7,5,9,3 (d) 9,5,7,3
A[T]是栈顶元素
P76#15 用一维数组设计栈,初态是栈空, top=0。现有输入序列是 a、b、c、d,经过 push 、push、pop、push、pop、push操作后,输出 序列是( b、c ),栈顶指针是( 2 )

DS_chap03

DS_chap03

3.2 栈的表示和实现
C语言中,顺序栈也可以采用 语言中, 语言中
静态分配
typedef struct{ SElemType base[STACK_INIT_SIZE]; //指示栈顶位置 int top; //指示栈顶位置 SqStack; }SqStack;
建议! 建议!
动态分配
typedef struct{ SElemType *base; SElemType *top; // 设两指针便于判断栈是否为空 栈的当前可使用的最大容量. int StackSize; // 栈的当前可使用的最大容量. SqStack; }SqStack;
南昌航空大学软件学院
9
第3章 栈和队列
3.2 栈的表示和实现
顺序栈
利用一组地址连续的存储单元依次存放自栈底 到栈顶的数据元素,同时附设指针top指示栈 到栈顶的数据元素,同时附设指针top指示栈 top 顶元素在顺序栈中的位置。 顶元素在顺序栈中的位置。 栈所需最大空间很难估计,一般来说, 栈所需最大空间很难估计,一般来说,在初始 化设空栈时不应限定栈的最大容量。 化设空栈时不应限定栈的最大容量。设定两个 常量: 常量: 存储空间初始分配量 存储空间初始分配量——MAX_STACK MAX_STACK 初始分配量 存储空间分配增量 分配增量——STACKINCREMENT 存储空间分配增量 STACKINCREMENT
南昌航空大学软件学院 14
第3章 栈和队列
3.2 栈的表示和实现
顺序栈
Pop(&S,&e)
void Pop(SqStack &S, SElemType &e) { if (S.top == -1) exit(“Stack empty”); exit( Stack is empty ); else *e=S.base[S.top--]; *e=S.base[S.top--]; -}

第三章 汇编语言程序及实现

第三章 汇编语言程序及实现

2013-8-13
河南师范大学计算机与信息技术学院
29
汇编语言程序设计——方法、技术、应用
2. 属性指定操作
格式:THIS 类型名 利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指 定的类型。 LABEL伪指令的功能等同于‚EQU THIS‛。
示例1
示例2
2013-8-13
河南师范大学计算机与信息技术学院
河南师范大学计算机与信息技术学院
25
汇编语言程序设计——方法、技术、应用
运算符的优先级
1 2 3 4 5 6 7 8 9 10 () <> [] · LENGTH SIZE WIDTH MASK PTR OFFSET SEG TPYE THIS : HIGE LOW * / MOD SHL SHR + EQ NE GT LT GE LE NOT AND 建议采用圆括号‚()‛ OR XOR 显式表达,它可以极大 SHORT 地提高程序的可阅读性。

2013-8-13
河南师范大学计算机与信息技术学院
13
汇编语言程序设计——方法、技术、应用
1.常量
常量表示一个固定的数值。不占存储空间。
常量在程序中可以直接出现,对于经常使用的常量可以定义为符号常量。 常量在伪指令语句中主要用于给变量赋初值,在指令语句中常用作立即 数及存储器寻址方式中的位移量。 数值常量可以是二、八、十、十六进制数。 字符常量是将字符用单引号或双引号界定; 字符串常量是将字符串用单引号或双引号引起,单引号字符本身用连 续两个单引号引起。 各种符号的属性值可作为常量使用,称为属性常量。
2013-8-13
河南师范大学计算机与信息技术学院
28
汇编语言程序设计——方法、技术、应用

栈和队列答案

栈和队列答案

第3章栈和队列答案一、填空题1. 向量、栈和队列都是线性结构,可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。

2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。

不允许插入和删除运算的一端称为栈底。

3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

4. 在具有n个单元的循环队列中,队满时共有 n-1 个元素。

5. 带表头结点的空循环双向链表的长度等于0。

解:Array二、判断正误(×)1. 在表结构中最常用的是线性表,栈和队列不太常用。

错,不一定吧调用子程序或函数常用,CPU中也用队列。

(√)2. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。

(√)3. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。

正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

(×)4. 栈和链表是两种不同的数据结构。

错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。

(×)5. 栈和队列是一种非线性数据结构。

错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

(√)6. 栈和队列的存储方式既可是顺序方式,也可是链接方式。

(√)7. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。

(×)8. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。

错,后半句不对。

(×)9. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。

错,有可能。

三、单项选择题( B)1. 栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(C)2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为A.i B.n=i C.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,…,n,则出栈的序列是n,…,3,2,1。

西安电子科技大学数据结构课件复习

西安电子科技大学数据结构课件复习

for (i=1; i <=n; i++) { s=0; for (j=1; j <=n; j++) s=s+i×j; if (s%2) print(s) } 西安电子科技大学
①n ② n2 ③ n
- Xidian University, China
数据结构
– Data Structures
第二章 线性表
本章内容:
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示与实现 2.3.1 线性链表 2.3.2 循环链表 2.3.3 双向链表 2.4 一元多项式的表示及相加
西安电子科技大学 - Xidian University, China
数据结构
– Data Structures
数据结构 Data Structures
期末复习
数据结构
– Data Structures
课程⺫目目录
第1章 概论 第2章 线性表 第3章 栈和队列 第4章 串 第5章 数组和干广广义表 第6章 树和二二叉树 第7章 图 第9章 查找 第10章 内部排序
西安电子科技大学 - Xidian University, China
西安电子科技大学 - Xidian University, China
数据结构
– Data Structures
第三章 栈和队列
本章内容:
3.1 栈 3.1.1 栈的定义 3.1.2 栈的表示和实现 3.2 栈的应用举例 3.3 栈与递归 3.4 队列 3.4.1 队列的定义 3.4.2 链队列 3.4.3 循环队列
A0,0 A1,0 A1,1
. . .
A7,0 A8,0 A7,1 A8,1

单片机原理及应用第三章课后答案

单片机原理及应用第三章课后答案

第三章作业答案2. MCS-51有(4)个8位并行I/O口,在作为通用I/O口使用时P0~P3是准双向口,所以由输出转输入时必须先写入(1)。

6. 设(TMOD)=0A5H,则定时器T0的状态是( 方式1计数),定时器T1的状态是( 方式2定时)。

或设(TMOD)=0A5H,则定时器T0的状态是( 软件控制的16位计数器),定时器T1的状态是(软硬件控制的可自动重装初值的8位定时器)。

27.请写出1INT为低电平触发的中断系统初始化程序。

解:INT为低电平触发的中断系统初始化程序如下:1ORG 0000HLJMP MAINORG 0013HLJMP INTN1ORG 0100HMAIN:MOV SP,#60HSETB EASETB EX1;开1INT中断CLR PX1 ;令1INT为低优先级CLR IT1 ;令1INT为电平触发SJMP $INTN1:……RETIEND用MOV指令实现:MOV IE,#84HANL IP,#0FBH(或ORL IP,#04H)ANL TCON,#0FBH28.MCS-51单片机响应中断后,写出中断服务子程序的入口地址。

解:36.使用一个定时器,如何通过软硬结合方法实现较长时间的定时?解:设定好定时器的定时时间,采用中断方式用软件进行溢出次数累计,从而得到较长的定时时间,定时时间=定时器的定时时间×软件累计的溢出次数。

37.利用定时器输出周期为2 ms的方波, 设单片机晶振频率为6 MHz。

试编程实现之。

解:选用定时器/计数器T0 作定时器,工作在方式1,输出为P1.0 引脚,2 ms 的方波可由1 ms的高低电平相间隔而成,因而只要每隔1 ms对P1.0 取反一次即可得到这个方波。

初值的计算如下:T0=12/(6×106)= 2×10-6STC=M-T/T0=216-1×10-3/2×10-6=65536-500=65036=FE0CH当定时器/计数器采用方式0时,初值为:TC=M-T/T0=213-1×10-3/2×10-6=8192-500=7692=1E0CH,则真正的16位计数初值为:1E0CH(高8位,低5位)利用定时器/计数器时,必须用文字说明工作方式的设置,计算初值。

ch3

ch3

第三章本章介绍的是栈和队列的逻辑结构定义及在两种存储结构(顺序存储结构和链式存储结构)上如何实现栈和队列的基本运算。

本章的重点是掌握栈和队列在两种存储结构上实现的基本运算,难点是循环队列中对边界条件的处理。

1.栈的逻辑结构、存储结构及其相关算法(综合应用):栈的逻辑结构和我们先前学过的线性表相同,如果它是非空的,则有且只有一个开始结点,有且只能有一个终端结点,其它的结点前后所相邻的也只能是一个结点(直接前趋和直接后继),但是栈的运算规则与线性表相比有更多的限制,栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,通常称插入、删除这一端为栈顶,另一端称为栈底。

表中无元素时为空栈。

栈的修改是按后进先出的原则进行的,我们又称栈为LIFO表(Last In First Out).栈的基本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满: StackFull(S)、进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素退栈: Pop(S) 、可形象地理解为弹出,弹出后栈中就无此元素了。

取栈顶元素:StackTop(S),不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。

由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。

我们要了解的是,在顺序栈中有"上溢"和"下溢"的概念。

顺序栈好比一个盒子,我们在里头放了一叠书,当我们要用书的话只能从第一本开始拿(你会把盒子翻过来吗?真聪明^^),那么当我们把书本放到这个栈中超过盒子的顶部时就放不下了(叠上去的不算,哼哼),这时就是"上溢","上溢"也就是栈顶指针指出栈的外面,显然是出错了。

反之,当栈中已没有书时,我们再去拿,看看没书,把盒子拎起来看看盒底,还是没有,这就是"下溢"。

1-6章作业

1-6章作业

第1章绪论【书面作业】1、下列是几种二元组表示的数据结构,画出它们的逻辑结构图,并指出它们分别属于何种结构。

①A=(K,R),其中K={a,b,c,d,e,f,g,h}R={r}r={<a,b>,<b,c>,<c,d>,<d,e>,<e,f>,<f,g>,<g,h>}②B=(K,R),其中K={a,b,c,d,e,f,g,h}R={r}r={<d,b>,<d,g>,<d,a>,<b,c>,<g,e>,<g,h>,<e,f>}③C=(K,R),其中K={a,b,c,d,e,f}R={r}r={<a,b>,<b,c>,<b,d>,<c,d>,<c,e>,<c,f>,<d,e>,<d,f>}2、求下面程序段的时间复杂度①for (i=0;i<n; i++) ②i=s=0;③s=0;for(j=0;j<m; j++) while(s<n) for(i=0;i<n;i++)a[i][j]=0; { i++; for(j=0;j<n; j++)s+=i;} s+=b[i][j];④x=n; y=0;while ( (x>=(y+1)*(y+1) )y=y+1;【上机作业】1.熟悉VC++编程环境2.TRIPLET算法实现(看懂程序)3. 已知输入x, y, z三个不相等的整数,实现三个数从小到大顺序的输出,其中x 中存放最小数,y中存放次小数。

要求使用引用参数来实现。

4. 测试算法的运行时间在此,我们通过一个比较两个算法执行效率的程序例子,掌握测试算法运行时间的基本方法。

这里涉及到C语言中标准的函数库sys/timeb。

考研数据结构必须掌握的知识点与算法-打印版

考研数据结构必须掌握的知识点与算法-打印版

考研数据结构必须掌握的知识点与算法-打印版《数据结构》必须掌握的知识点与算法第一章绪论1、算法的五个重要特性(有穷性、确定性、可行性、输入、输出)2、算法设计的要求(正确性、可读性、茁壮性、效率与低存储量需求)3、算法与程序的关系:(1)一具程序别一定满脚有穷性。

例操作系统,只要整个系统别遭破坏,它将永久不可能停止,即使没有作业需要处理,它仍处于动态等待中。

所以,操作系统别是一具算法。

(2)程序中的指令必须是机器可执行的,而算法中的指令则无此限制。

算法代表了对咨询题的解,而程序则是算法在计算机上的特定的实现。

(3)一具算法若用程序设计语言来描述,则它算是一具程序。

4、算法的时刻复杂度的表示与计算(那个比较复杂,具体看算法本身,普通关怀其循环的次数与N的关系、函数递归的计算)第二章线性表1、线性表的特点:(1)存在唯一的第一具元素;(这一点决定了图别是线性表)(2)存在唯一的最终一具元素;(3)除第一具元素外,其它均惟独一具前驱(这一点决定了树别是线性表)(4)除最终一具元素外,其它均惟独一具后继。

2、线性表有两种表示:顺序表示(数组)、链式表示(链表),栈、队列基本上线性表,他们都能够用数组、链表来实现。

3、顺序表示的线性表(数组)地址计算办法:(1)一维数组,设DataType a[N]的首地址为A0,每一具数据(DataType 类型)占m个字节,则a[k]的地址为:A a[k]=A0+m*k(其直截了当意义算是求在数据a[k]的前面有多少个元素,每个元素占m个字节)(2)多维数组,以三维数组为例,设DataType a[M][N][P]的首地址为A000,每一具数据(DataType 类型)占m个字节,则在元素a[i][j][k]的前面共有元素个数为:M*N*i+N*j+k,其其地址为:A a[i][j][k]=A000+m*(M*N*i+N*j+k);4、线性表的归并排序:设两个线性表均差不多按非递减顺序排好序,现要将两者合并为一具线性表,并仍然接非递减顺序。

第3章 栈和上机作业

第3章  栈和上机作业

例3.4 编写一个算法利用顺序栈判断一个字符串是否 是对称串。所谓对称串是指从左向右读和从右向左 读的序列相同。

int symmetry(ElemType str[]) { int i; ElemType e;SqStack *st; InitStack(st); For(i=0;str[i]!=‘\0’;i++); Push(st,str[i]); For(i=0;str[i]!=‘\0’;i++); { Pop(st,e); if(str[i]!=e) Return(0); } Return(1);}
s
^
(2) 销毁栈ClearStack(&s) 释放栈s占用的全部存储空间。对应算法: void ClearStack(LiStack *&s) { LiStack *p=s;*q=s->next; while (q!=NULL) { free(p); p=q; q=p->next; } free(p); }
(7) 取栈顶元素GetTop(s) 在栈不为空的条件下,将头结点后继 数据结点的数据域赋给e。对应算法如下: int GetTop(LiStack *s,ElemType &e) { if (s->next==NULL) return 0; /*栈空的情况 */ e=s->next->data; return 1; }
3.1.4 栈的应用例子 1. 表达式求值
这里限定的表达式求值问题是:用户
正整数和圆括号的合法数学表达式,计算 该表达式的运算结果。
输入一个包含“+”、“-”、“*”、“/”、
在程序语言中,运算符位于两个操作 数中间的表达式称为中缀表达式。例如: 1+2*3 就是一个中缀表达式,中缀表达式是 最常用的一种表达式方式。对中缀表达 式的运算一般遵循“先乘除,后加减,从 左到右计算,先括号内,后括号外”的规 则。因此,中缀表达式不仅要依赖运算符 优先级,而且还要处理括号。

第3章 Activity ——教学设计

第3章 Activity ——教学设计

《移动应用开发技术》教学设计课程名称:移动应用开发技术授课年级:授课学期:教师姓名:教学过程第一学时(Activity简介、Activity的创建)一、情景导入1、什么是Activity不知道大家有没有想过这样一个问题,每个应用程序都有很多界面组成,这些界面由什么管理的呢?同学进行回答,然后老师引出本节课要讲解的Activity。

二、知识讲解1、Activity简介(PPT8-10)在Android系统中,用户与程序的交互是通过Activity完成的。

Activity是Android应用程序的四大组件之一,它负责管理Android应用程序的界面。

一个应用程序一般会包含若干个Activity,每一个Activity组件负责一个界面的展现。

下面列举几个Activity的常用事件,具体如下:•onKeyDown(int keyCode,KeyEvent event):对应按键按下事件•onKeyUp(int keyCode,KeyEvent event):对应按键松开事件•onTouchEvent(MotionEvent event):对应点击屏幕事件然后在MainActivity中重写上述方法,运行程序进行测试。

2、Activity的创建(PPT11)老师引导,大家对Activity有了简单的认识,接下来分步骤演示如何创建Activity。

1)定义一个类继承自android.app.Activity或者其子类;2)在res/layout目录中创建一个xml文件,用于创建Activity的布局;3)在AndroidManifest.xml文件中注册Activity;4)重写Activity的onCreate()方法,并在该方法中使用setContentView()加载指定的布局文件;Activity中的代码如下所示:public class ActivityExample extends Activity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_example);}}三、知识巩固1、总结知识点,使用博学谷系统中的随堂练习题巩固本节课所学知识。

OS03_2知识点和上机作业

OS03_2知识点和上机作业

第二/三章:进程与线程掌握要点:1.掌握并发执行的特征与条件。

2.理解进程的概念与状态(转换)。

3.linux的进程(任务)控制块都包含了进程的那些信息?4.进程间通信有那几种方式!各自的工作原理?5.简述进程的创建过程以及fork函数与vfork函数的区别。

6.比较线程和进程的优缺点!7.用户级线程和内核级线程的概念及各自特点。

上机作业:(共2源程序,2个可执行程序):1. 观看03_pth1.c运行过程中进程(线程)的变化!简述这种变化出现的原因!!#include <pthread.h>#include <stdio.h>int sum;/* this data is shared by the thread(s) */void *runner(void *param);/* the thread */main(int argc,char *argv[]){pthread_t tid;/* the thread indentifier */pthread_attr_t attr;/*set of thread attributes */if(argc!=2){fprintf(stderr,"usage;%s <interger value>\n",argv[0]);exit();}if(atoi(argv[1])<0){fprintf(stderr,"%d must be <= 0\n",atoi(argv[1]));exit();}/* get the default attributes */pthread_attr_init(&attr);/* creat the thread */pthread_create(&tid,&attr,runner,argv[1]);/* now wait for the thread to exit */pthread_join(tid,NULL);printf("sum = %d\n",sum);}/* the thread will begin control in this function */void *runner(void *param){int upper = atoi(param);int i;sum = 0;if(upper > 0){for(i=1;i<=upper;i++) sum += i;}pthread_exit(0);}补充材料一:linux多线程编程pthreadLinux系统下的多线程遵循POSIX线程接口,称为pthread。

软基上机实验报告-栈和队列(基本题)

软基上机实验报告-栈和队列(基本题)

一、程序流程说明链栈3-1:1.建立一个空链栈:将链栈的栈顶置为NULL2.进栈:新建一个链栈节点,令这个节点的数据为需要进栈的数据,然后将这个节点指向原栈顶,将栈顶重新定义为这个节点并返回。

3.出栈:首先判断链栈是否为空,如果不为空返回栈顶的下一个节点,然后释放栈顶。

4.建立链栈:建立一个空链栈后调用进栈函数将数据一个一个进栈即可。

循环队列3-2:1.置空队列:使p->front=p->rear=0即可由于循环队列的性质队头或队尾的后移需要这样定义:p->rear=(p->rear+1)%N;p->front=(p->front+1)%N;2.进队列:首先判断队列是否已满,如果没满,将数据插入队尾,然后将队尾向后移动一格。

3.出队列:首先判断队列是否为空,如果不为空,返回队头元素,并将队头向后移一格。

4.aa函数:,调用出队函数把队列q中的元素一一出队,如果是负数直接抛弃;如果是正数,则调用入队函数,插入到q的队尾。

程序代码:链栈3-1:#include<stdio.h>#include<stdlib.h>struct node{int data;//节点信息struct node *next;};//建立一个空链栈node *empty(node *top){top=NULL;return top;}//进栈函数node *pushs(node *top,int x){node *p;p=(node*)malloc(sizeof(node));p->data=x;p->next=top;top=p;return top;}//出栈函数node *pops(node *top){node *p;if(top==NULL){printf("error!\n");return NULL;}else{p=top;top=p->next;free(p);}return top;}//显示函数void show(node *top){printf("the numbers are:\n");while(top!=NULL){printf("%d ",top->data);top=top->next;}}void main(){node *top;top=(node*)malloc(sizeof(node));int x;top=empty(top);printf("insert your number!(use zero as the end)\n");scanf("%d",&x);while(x!=0){top=pushs(top,x);scanf("%d",&x);}show(top);top=pops(top);top=pops(top);printf("\nAfter twice pops\n");show(top);}循环队列3-2::#include<stdio.h>#include<stdlib.h>#define N 20#define true 1#define false 0typedef struct{int data[N];int front, rear;}node;//进队列函数int enter(node *p,int x){if(((p->rear)+1)%N==p->front)return (false);else{p->data[p->rear]=x;p->rear=(p->rear+1)%N;return (true);}}//出队列函数int out(node *p){int x;if(p->rear==p->front)return (NULL);else{x=p->data[p->front];p->front=(p->front+1)%N;}return x;}//aa函数,其功能为,调用出队函数把队列q中的元素一一出队,//如果是负数直接抛弃;如果是正数,则调用入队函数,插入到q的队尾。

微机原理三章作业

微机原理三章作业

7654h
Less Than
〔习题3.17〕 已知用于LED数码管的显示代码表为:
LEDtable db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h,88h,83h,0c6h,0c1h,86h,8eh
它依次表示0~9、A~F这16个数码的显示 代码。现编写一个程序实现将lednum中 的一个数字(0~9、A~F)转换成对应 的LED显示代码。
参考P71,例3-4 • 思考: 如果需要将更多的数据转换成其ASCII码显示 出来呢?(ex3-4-2.asm) hex db 04h,0bh,0fh,06h,0ah
参考 P75,例3-8 P75,例3-9
〔习题3.16〕编写一个程序,把从键盘输入的一个
小写字母用大写字母显示出来。
mov ah,1 ;输入小写字母 int 21h sub al,20h ;转换为大写字母 mov dl,al mov ah,2 int 21h ;显示
HTOASC
?两个ret
分两次调用htoasc子程序
push ax mov cl, 4 ror al, cl call HTOASC call disp_a_char pop ax call HTOASC call disp_a_char
?push和pop的作用
3.30
写一个子程序,根据入口参数AL=0、1、 2,依次实现对大写字母转换成小写、小写 转换成大写或大小写字母互换。欲转换的 字符串在string中,用0表示结束。 “abcd”(AL=0)
3.27:hw3-27.asm
编写一个源程序,在键盘上按一个键,将从 AL 返 回 的 ASCII 码 值 显 示 出 来 , 如 果 按 下 ESC键则程序退出。 可调用书中的HTOASC子程序。

数据结构A-教学大纲

数据结构A-教学大纲

《数据结构》教学大纲课程编号:070114A课程类型:□通识教育必修课□通识教育选修课专业必修课□专业选修课□学科基础课总学时:64 讲课学时:48 实验(上机)学时:16学分:4适用对象:信息管理与信息系统专业(电子商务)、电子商务专业(商务智能)、信息管理与信息系统专业(量化投资)先修课程:高等数学、程序设计基础与应用一、教学目标程序的构成与数据结构是两个不可分割的问题。

为解决现实世界中的问题,必须先对问题进行分析,得到问题本身的逻辑关系,然后采用合理的数学模型进行表示,这需要对程序构造进行系统而科学的研究,因而数据结构是设计与实现编译程序,操作系统,数据库系统,多媒体信息处理,数字图象处理及其它系统程序和大型应用程序的重要基础,是介于数学,计算机硬件,软件之间的一门核心课程,是信息管理与管理信息系统专业一门重要的专业技术基础课程。

本课程的目的在于向学生介绍计算机是如何处理, 组织和操作数据,如何评价算法的效率,使学生能够利用所学的理论知识解决实际问题,培养学生分析问题、解决问题的能力。

通过本课程的学习,使学生深透地理解数据结构的逻辑结构和物理结构的基本概念以及有关算法,培养基本的、良好的程序设计技能,编制高效可靠的程序,为学习操作系统、编译原理和数据库等课程奠定基础。

二、教学内容及其与毕业要求的对应关系(一)教学内容本课程的主要内容包括数据的逻辑结构和存储结构及在两者之上设计的算法。

数据的逻辑结构主要包括线性结构、层次结构和图结构;存储结构包括顺序存储和链式存储。

具体内容可分为5部分:1)线性结构数据的存储和运算,栈与队列的特点与应用、数组的存储与效率;2)树状结构的存储与运算,二叉树的性质、存储与操作实现,哈夫曼树与哈夫曼编码;3)图状结构的存储于运算,图的应用与相关算法的设计、实现;4)静态查找与动态查找的相关算法;5)各种排序算法及其效率比较分析。

(二)教学方法和手段根据教学目标,拟采用的教学方法有:课堂讲解基本概念和核心知识,讲授和讨论相结合领会知识要点,案例教学训练解决问题的能力,最后在visualC平台下进行上机操作和具体实践。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ return(s->top+1);
}
(4) 判断栈是否为空StackEmpty(s)
栈 S 为空的条件是 s->top==-1 。对 应算法如下: int StackEmpty(SqStack *s)
{ return(s->top==-1);
}
(5) 进栈Push(&s,e) 在栈不满的条件下 , 先将栈指针增 1, 然后在该位置上插入元素 e 。对应算法如 下: int Push(SqStack *&s,ElemType e) { if (s->top==MaxSize-1) return 0; /*栈满的情况,即栈上溢出*/ s->top++; s->data[s->top]=e; return 1; }
3.1.2 栈的顺序存储结构及其基本运算实现
假设栈的元素个数最大不超过正整数 MaxSize,所有的元素都具有同一数据类型 ElemType,则可用下列方式来定义栈类型 SqStack: typedef struct
{ ElemType data[MaxSize];
int top; /*栈指针*/
(5) 进栈Push(&S,e):将元素e插入到栈 s中作为栈顶元素。 (6) 出栈Pop(&s,&e):从栈s中退出栈顶 元素,并将其值赋给e。 (7) 取栈顶元素 GetTop(s,&e): 返回当 前的栈顶元素,并将其值赋给e。 (8) 显示栈中元素 DispStack(s): 从栈 顶到栈底顺序显示栈中所有元素。
(7) 取栈顶元素GetTop(s)
在栈不为空的条件下,将栈顶元素赋 给e。对应算法如下: int GetTop(SqStack *s,ElemType &e) { if (s->top==-1) return 0; /*栈为空的情况,即栈下溢出*/ e=s->data[s->top]; return 1; }
例3.4 编写一个算法利用顺序栈判断一个字符串是否 是对称串。所谓对称串是指从左向右读和从右向左 读的序列相同。

int symmetry(ElemType str[]) { int i; ElemType e;SqStack *st; InitStack(st); For(i=0;str[i]!=‘\0’;i++); Push(st,str[i]); For(i=0;str[i]!=‘\0’;i++); { Pop(st,e); if(str[i]!=e) Return(0); } Return(1);}
3.1.3 栈的链式存储结构及其基本运算的 实现 采用链式存储的栈称为链栈,这里采 用单链表实现。 链栈的优点是不存在栈满上溢的情况。 我们规定栈的所有操作都是在单链表的表 头进行的,下图是头结点为*lhead的链栈, 第一个数据结点是栈顶结点,最后一个结 点是栈底结点。栈中元素自栈顶到栈底依 次是a1、a2、…、an。
} SqStack;
在顺序栈中实现栈的基本运算算法: (1) 初始化栈initStack(&s) 建立一个新的空栈 s, 实际上是将栈顶指针 指向-1即可。对应算法如下: void InitStack(SqStack *&s) { s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; }
进栈(push) top an ⋯⋯ ai ⋯⋯
顺序栈示意图
顺序栈进栈和出栈示意图
栈的几种基本运算如下: (1) 初始化栈InitStack(&s):构造一个 空栈s。 (2) 销毁栈ClearStack(&s):释放栈s占 用的存储空间。 (3) 求栈的长度 StackLength(s): 返回 栈s中的元素个数。 (4) 判断栈是否为空 StackEmpty(s):若 栈s为空,则返回真;否则返回假。
第3章 栈和队列
3.1 栈 3.2 队列 3.3 本章小结
3.1 栈
3.1.1 栈的定义
3.1.2 栈的顺序存储结构及 其基本运算实现 3.1.3 栈的链式存储结构及其 基本运算的实现 3.1.4 栈的应用例子
3.1.1 栈的定义
栈是一种只能在一端进行插入或删除操 作的线性表。 表中允许进行插入、删除操作的一端称 为栈顶。 栈顶的当前位置是动态的 , 栈顶的当前 位置由一个称为栈顶指针的位置指示器指示。 表的另一端称为栈底。 当栈中没有数据元素时,称为空栈。 栈的插入操作通常称为进栈或入栈 , 栈 的删除操作通常称为退栈或出栈。
顺序栈进栈和出栈示意图
(2) 销毁栈ClearStack(&s)
释放栈s占用的存储空间。对应算法 如下: void ClearStack(SqStack *&s)
{ free(s);
}
(3) 求栈的长度StackLength(s)
返回栈 s 中的元素个数 , 即栈指针加 1 的结果。对应算法如下: int StackLength(SqStack *s)
链栈示意图
链栈中数据结点的类型 LiStack 定 义如下: typedef struct linknode
{
ElemType data;
/*数据域*/
/*指针域*/
struct linknode *next; } LiStack;
在链栈中,栈的基本运算算法如下: (1) 初始化栈initStack(&s) 建立一个空栈 s 。实际上是创建链栈 的头结点 , 并将其 next 域置为 NULL 。对应 算法如下: void InitStack(LiStack *&s) { s=(LiStack *)malloc(sizeof(LiStack)); s->next=NULL; }
(8) 显示栈中元素DispStack(s) 从栈顶到栈底顺序显示栈中所有元 素。对应算法如下: void DispStack(SqStack *s) { int i; for(i=s->top;i>=0;i--) printf("%c ",s->data[i]); printf("\n"); }
(6) 出栈Pop(&s,&e) 在栈不为空的条件下,先将栈顶元素 赋给e,然后将栈指针减1。对应算法如下: int Pop(SqStack *&s,ElemType &e) { if (s->top==-1) return 0; /*栈为空的情况,即栈下溢出*/ e=s->data[s->top]; s->top--; return 1; }
相关文档
最新文档