堆栈在树形结构中使用的实例

堆栈在树形结构中使用的实例
堆栈在树形结构中使用的实例

'================================================================== =============

' 堆栈在树形结构中使用的实例

' By Lee1892, 2012.12.09 '-------------------------------------------------------------------------------

' 本实例实现一下功能:

' (1) 树形结构中,按级数汇总数量,即每级汇总该级下全部数量

' (2) 按树形结构设置Excel的数据分组及分级显示

' (3) 使用方框与连接线绘制树形,类似TreeView效果

'-------------------------------------------------------------------------------

' 原始数据中,有全部数形结构数据,各节点唯一的编号、能指示节点所在级数的符号、

' 节点的名称、需要统计的数量。该树形结构各分支的级数不确定,仅在各分支的末梢节点有

' 待统计的数量数据。

'-------------------------------------------------------------------------------

' 本代码采用字典对象模拟堆栈,对原始数据循环一次扫描完成统计计算并绘制树形图,

' 可学习到堆栈、字典对象、结构图绘制、数据分组分级显示、代码操控单元格公式等多方面

' 内容。

' 本实例可应用于材料清单(BOM)的统计、公司结构绘制等多种实践。

'================================================================== =============

Const TR_LEVEL_MARK = "+"

Const TR_COL_INDEX = "A"

Const TR_COL_LEVEL = "B"

Const TR_COL_NAME = "C"

Const TR_COL_COUNT = "D"

Const TR_COL_TREE_START = "F"

Const TR_ROW_HEIGHT = 23

Const TR_COL_LINE_WIDTH = 3

Const TR_COL_BOX_MARGIN = 4

Sub CalculationAndDrawTree()

Dim iMaxRow&, i&, j&, dic, aKeys, iLevelLast%, iLevelNow%

'全部恢复

'Undo_All

Application.ScreenUpdating = False

'最大行号

iMaxRow = Cells(65536, 1).End(xlUp).Row

'设置行高

Rows("1:" & iMaxRow).RowHeight = TR_ROW_HEIGHT

'初始前一节点的级数

iLevelLast = 0

'设置字典对象以模拟堆栈,Key为行号,Item为对应的级数。也可以反过来用的...

Set dic = CreateObject("Scripting.Dictionary")

'循环自数据起始行始至数据结尾行加一止,多一行以收尾堆栈内最后剩余的节点

For i = 2 To iMaxRow + 1

If i = iMaxRow + 1 Then

iLevelNow = 0

Else

'获得当前节点级数,此例用B列加号数量判断

iLevelNow = UBound(Split(Range(TR_COL_LEVEL & i),

TR_LEVEL_MARK))

'设置当前行的大纲级数,不影响SUBTOTAL函数的计算

Rows(i).OutlineLevel = iLevelNow

EndIf

'如果前一节点在堆栈内,且前一节点级数同当前节点,则将前一节点从堆栈内删除

If dic.exists(i - 1) Then

If dic(i - 1) = iLevelNow Then dic.Remove i - 1

EndIf

'判断当前节点和前一节点的级数关系

If iLevelNow > iLevelLast Then

'当前节点级数大于前一节点,将当前节点压入堆栈

dic(i) = iLevelNow

ElseIf iLevelNow < iLevelLast Then

'当前节点级数小于前一节点,将堆栈内大于等于当前节点级数的项有堆栈顶始逐一弹出,并执行内容

'获得堆栈内记录的行号数组

aKeys = dic.keys

'由堆栈顶始向堆栈底扫描

For j = UBound(aKeys)ToLBound(aKeys)Step -1

'如扫描至记录的级数小于当前节点级数则退出扫描

If dic(aKeys(j)) < iLevelNow ThenExitFor

With Range(TR_COL_COUNT & aKeys(j))

'设置统计公式为:SUBTOTAL(9, 该级下所有行),该函数自动忽略选中区域内含有SUBTOTAL公式的单元格

.Formula = "=SUBTOTAL(9, " & TR_COL_COUNT & aKeys(j) + 1 & ":" & TR_COL_COUNT & i - 1 & ")"

'设置背景色和字体颜色

.Interior.ColorIndex = 33 - dic(aKeys(j))

.Font.ColorIndex = dic(aKeys(j)) + 1

EndWith

'删除堆栈顶部项目

dic.Remove aKeys(j)

Next

'将当前节点压入堆栈

dic(i) = iLevelNow

EndIf

'记录当前节点为前一节点,供下一个循环使用

iLevelLast = iLevelNow

'绘制当前节点框,并与父节点绘制连接线

If i < iMaxRow + 1 Then DrawLevelBox i, iLevelNow, dic

Next

'清空字典项并重置对象

dic.RemoveAll: Set dic = Nothing

'设置大纲项目的汇总行在上方

With Outline

.AutomaticStyles = False

.SummaryRow = xlAbove

.SummaryColumn = xlRight

EndWith

Application.ScreenUpdating = True

EndSub

PrivateSub DrawLevelBox(iRow, iLevel, dic)

Dim iCol&, nLeft!, nTop!, nWidth!, nHeight!, iParent&, aKeys, sName$, sParentName$ '计算绘图区起始列号

iCol = Columns(TR_COL_TREE_START).Column + (iLevel - 1) * 2

'设置连接线所在列列宽

If Columns(iCol - 1).ColumnWidth <> TR_COL_LINE_WIDTH Then

Columns(iCol - 1).ColumnWidth = TR_COL_LINE_WIDTH

EndIf

'设置节点框所在列宽

If Columns(iCol).ColumnWidth <> Cells(1, TR_COL_NAME).ColumnWidth +

TR_COL_BOX_MARGIN Then

Columns(iCol).ColumnWidth = Cells(1, TR_COL_NAME).ColumnWidth +

TR_COL_LINE_WIDTH

EndIf

'计算节点框位置和大小

With Cells(iRow, iCol)

nTop = .Top + TR_COL_BOX_MARGIN / 2

nLeft = .Left + TR_COL_BOX_MARGIN / 2

nWidth = .Width - TR_COL_BOX_MARGIN

nHeight = .Height - TR_COL_BOX_MARGIN

EndWith

'获得节点框名称

sName = Cells(iRow, TR_COL_INDEX).Text

'绘制节点框

With Shapes.AddShape(msoShapeRectangle, nLeft, nTop, nWidth, nHeight)

'节点框内容为节点名称

.TextFrame.Characters.Text = Cells(iRow, TR_COL_NAME).Text

'设置节点框名为节点编号(唯一)

.Name = sName

EndWith

'如果堆栈内为空,则退出(不用画连接线)

If dic.Count = 0 ThenExitSub

aKeys = dic.keys

'判断堆栈内最后一个节点与当前节点关系

If iRow = aKeys(UBound(aKeys)) Then

'如果堆栈内最后节点同当前节点,且堆栈仅余一个节点,则退出(不用画连接线)IfUBound(aKeys) = 0 ThenExitSub

'如果堆栈内最后节点同当前节点,则堆栈内倒数第二个节点为父节点

iParent = aKeys(UBound(aKeys) - 1)

Else

'如果堆栈内最后节点不同于当前节点,则堆栈内最后节点为父节点

iParent = aKeys(UBound(aKeys))

EndIf

'获得父节点框名称

sParentName = Cells(iParent, TR_COL_INDEX).Text

'计算连接线位置和大小

With Shapes(sParentName)

nLeft = .Left '+ .Width '由于连接符会自动调节长度的,所以可不需要精确控制

长度

nTop = .Top '+ .Height / 2

nWidth = nLeft '- Shapes(sName).Left

nHeight = .Top '- Shapes(sName).Top

EndWith

'绘制连接线

With Shapes.AddConnector(msoConnectorElbow, nLeft, nTop, nWidth, nHeight)

'水平翻转

'.Flip msoFlipHorizontal '由于连接符会自动调节的,所以可不需要2个翻转

'垂直翻转

'.Flip msoFlipVertical

'起点为父节点框的第4个锚点(右侧连接点)

'.ConnectorFormat.BeginConnect Shapes(sParentName), 1 'Top

'.ConnectorFormat.BeginConnect Shapes(sParentName), 2 'Left

'.ConnectorFormat.BeginConnect Shapes(sParentName), 3 'Bottom

.ConnectorFormat.BeginConnect Shapes(sParentName), 4 'Right

'终点为本节点框的第2个锚点

.ConnectorFormat.EndConnect Shapes(sName), 2

'设置连接线名称

.Name = sParentName & "->" & sName

EndWith

EndSub

Sub Undo_All()

Dim i&, shp As Shape

Application.ScreenUpdating = False

With Cells

.EntireRow.AutoFit

.EntireColumn.ColumnWidth = TR_COL_LINE_WIDTH

.EntireColumn.AutoFit

.Interior.ColorIndex = xlNone

.Font.ColorIndex = 0

.ClearOutline

EndWith

Rows(1).RowHeight = TR_ROW_HEIGHT

For i = 1 To Cells(65536, 1).End(xlUp).Row

With Cells(i, TR_COL_COUNT)

If Left(.Formula, 1) = "=" Then .Formula = ""

EndWith

Next

ForEach shp In Shapes

If shp.Type <> msoFormControl Then shp.Delete

Next

Application.ScreenUpdating = True

EndSub

数据结构-堆栈和队列实验报告

实验二堆栈和队列 实验目的: 1.熟悉栈这种特殊线性结构的特性; 2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算; 3.熟悉队列这种特殊线性结构的特性; 3.熟练掌握队列在链表存储结构下的基本运算。 实验原理: 堆栈顺序存储结构下的基本算法; 堆栈链式存储结构下的基本算法; 队列顺序存储结构下的基本算法;队列链式存储结构下的基本算法;实验内容: 3-18链式堆栈设计。要求 (1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化Stacklnitiate (S), 非空否StackNotEmpty(S),入栈StackiPush(S,x), 出栈StackPop (S,d),取栈顶数据元素StackTop(S,d); (2)设计一个主函数对链式堆栈进行测试。测试方法为:依次把数据元素1,2,3, 4,5 入栈,然后出栈并在屏幕上显示出栈的数据元素; (3)定义数据元素的数据类型为如下形式的结构体, Typedef struct { char taskName[10]; int taskNo; }DataType; 首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。 3-19对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当 前的対尾位置下标,对头指针用于指示当前的対头位置下标。现要求: (1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空; (2)编写一个主函数进行测试。 实验结果: 3-18 typedef struct snode { DataType data; struct snode *n ext; } LSNode; /* 初始化操作:*/

完整版数据结构习题集第3章栈和队列

第3章栈和队列 一、选择题 1.栈结构通常采用的两种存储结构是(A )。 A、顺序存储结构和链表存储结构 B、散列和索引方式 C、链表存储结构和数组 D、线性链表结构和非线性存储结构 2.设栈ST 用顺序存储结构表示,则栈ST 为空的条件是( B ) A、ST.top-ST.base<>0 B、ST.top-ST.base==0 C、ST.top-ST.base<>n D、ST.top-ST.base==n 3.向一个栈顶指针为HS 的链栈中插入一个s 结点时,则执行( C ) 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; 4.从一个栈顶指针为HS 的链栈中删除一个结点,用x 保存被删除结点的值,则执行( C) A 、x=HS;HS=HS->next; B 、HS=HS->next;x=HS->data; C 、x=HS->data;HS=HS->next; D 、s->next=Hs;Hs=HS->next; 5.表达式a*(b+c)-d 的后缀表达式为( B ) A、abcdd+- B、abc+*d- C、abc*+d- D、-+*abcd 6.中缀表达式A-(B+C/D)*E 的后缀形式是( D ) A、AB-C+D/E* B、ABC+D/E* C、ABCD/E*+- D、ABCD/+E*- 7.一个队列的入列序列是1,2,3,4,则队列的输出序列是( B ) A、4,3,2,1 B、1,2,3,4 C、1,4,3,2 D、3,2,4,1 8.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为空的条件是() A、Q.rear-Q.front==n B、Q.rear-Q.front-1==n C、Q.front==Q.rear D、Q.front==Q.rear+1 9.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为满的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 10.若在一个大小为6 的数组上实现循环队列,且当前rear 和front 的值分别为0 和3,当从 队列中删除一个元素,再加入两个元素后,rear 和front 的值分别为() A、1,5 B、2, 4 C、4,2 D、5,1 11.用单链表表示的链式队列的队头在链表的()位置 A、链头 B、链尾 C、链中 12.判定一个链队列Q(最多元素为n 个)为空的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 13.在链队列Q 中,插入s 所指结点需顺序执行的指令是() A 、Q.front->next=s;f=s; B 、Q.rear->next=s;Q.rear=s;

数据结构 实验报告三

实验三的实验报告 学期: 2010 至_2011 第 2 学期 2011年 3月 27日课程名称: 数据结构专业:信息与计算科学 09 级5班实验编号: 03 实验项目:栈和队列实验指导教师 _冯山_姓名:朱群学号: 2009060548 实验成绩: 一实验目的: (1)熟练掌握栈和队列的抽象数据类型及其结构特点; (2)实现基本的栈和队列的基本操作算法程序。 二实验内容:(类C算法的程序实现,任选其一) (1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP 等操作)(必做); (2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计 与实现(选做); (3)以迷宫问题为例,以堆栈结构完成迷宫问题的求解算法和程序(选做)。三实验准备: 1) 计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分 析与代码设计与分析准备。 四实验步骤: 1.录入程序代码并进行调试和算法分析; 2.编写实验报告。 五实验过程 一设计与实现基本的堆栈结构下的各种操作(如堆栈的PUSH、POP等操作)(1)问题描述 实现堆栈各种基本操作,如Pop,Push,GetTop等操作,即输入数据,通过Push入栈,再通过Pop操作输出出栈的元素,即入栈a,b,c,d,出栈d,c,b,a (2)算法实现及基本思想 堆栈是后进先出的线性表,由Push输入元素,Pop输出元素,堆栈的Push 操作思想,即插入元素e为新的的栈顶元素,先判断栈满与否,追加存储空间,然后将e值赋给栈顶指针Top。输入数据时用for循环 堆栈的Pop操作思想,先判断栈是否为空,若栈不空,则删除栈的栈顶元素,用e返回其值, (3)数据结构 栈的顺序存储结构 Typedef struct {

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

第三章栈和队列试题 一、单项选择题 1.栈的插入和删除操作在()进行。 A. 栈顶 B. 栈底 C. 任意位置 D. 指定位置 2.当利用大小为n的数组顺序存储一个栈时,假定用top==n表示栈空,则向这个栈插入一个元素时, 首先应执行()语句修改top指针。 A. top++; B. top--; C. top = 0; D. top; 3.若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。 A. 3, 2, 1 B. 2, 1, 3 C. 3, 1, 2 D. 1, 3, 2 4.在一个顺序存储的循环队列中,队头指针指向队头元素的()位置。 A. 前一个 B. 后一个 C. 当前 D. 后面 5.当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为()。 A. n-2 B. n-1 C. n D. n+1 6.从一个顺序存储的循环队列中删除一个元素时,需要()。 A. 队头指针加一 B. 队头指针减一 C. 取出队头指针所指的元素 D. 取出队尾指针所指的元素 7.假定一个顺序存储的循环队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。 A. front+1 == rear B. rear+1 == front C. front == 0 D. front == rear 8.假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。 A. front == rear B. front != NULL C. rear != NULL D. front == NULL 9.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。若想在链式栈的栈顶插入一 个由指针s所指的结点,则应执行操作()。 A. top->link = s; B.s->link = top->link; top->link = s; C. s->link = top; top = s; D. s->link = top; top = top->link; 10.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。若想摘除链式栈的栈顶结点, 并将被摘除结点的值保存到x中,则应执行操作()。 A. x = top->data; top = top->link; B. top = top->link; x = top->data; C. x = top; top = top->link; D. x = top->data; 11.设循环队列的结构是 #define MaxSize 100 typedef int ElemType;

数据结构与算法-堆栈的操作

《数据结构与算法分析》课程实验报告

【实验目的】 1. 理解堆栈的存储特性。 2. 掌握堆栈的常用操作算法。 【实验内容】 1. 利用堆栈实现对任意进制的数的转换; 2. 堆栈的应用及操作。 【实验方式】 个人实验。 【实验设备与环境】 PC机,Windows XP操作系统,VC++6.0开发环境。 【数据结构及函数定义】 (1)类的定义:类的数据成员,成员函数 …………………………………… (2)主函数main()实现初始化操作,完成对子函数的调用…………………………………… (3)子函数 ………………………………… 【测试数据与实验结果】 (请用截图的方式展示实验结果,并辅以必要的文字说明) 【源程序清单】

(请附上源程序) #include #include #include struct stack { int data; struct stack *next; }; void main() { struct stack *creat();//创建链表函数 void output(struct stack *); struct stack *insert(struct stack *,int);//在栈顶压入元素函数 struct stack *read(struct stack *);//读栈顶元素函数 struct stack *head;

head=creat();//创建链表函数 head->next=NULL; int num,i,n,m; cout<<"输入数据:"; cin>>num; cout<<"输入要将输入数值转换成的进制:"; cin>>i; while(num) {n=num/i; m=num%i; head=insert(head,m);//在栈顶压入元素函数num=n; } output(head); printf("数值经过转换后为:"); while(head->next!=NULL) {head=read(head);} getchar(); cout<

数据结构实验六 堆栈实验

一,实验题目 实验六堆栈实验 设计算法,把一个十进制整数转化为二进制数输出。 二,问题分析 本程序要求将一个十进制整数转化为二进制数输出。完成此功能所要解决的问题是熟练掌握和运用入栈和出栈操作,实现十进制整数转化为二进制数。 (1)数据的输入形式和输入值得范围:输入的是一个十进制整数,且其为正整数。 (2)结果的输出形式:输出的是一个二进制整数 (3)测试数据:1)9 2)4500 三,概要设计 1.为了实现上述程序功能,需要: 构造一个空的顺序栈s 将十进制整数除以2的余数入栈 将余数按顺序出栈 2.本程序包含7个函数: 1)主函数main(); 2)顺序栈判栈空函数stackempty(seqstack *s) 3)顺序栈置空栈函数seqstack *initstack(seqstack *s) 4)顺序栈入栈函数push(seqstack *s,int x) 5)顺序栈出栈函数pop(seqstack *s) 6)顺序栈取栈顶元素函数gettop(seqstack *s) 7)将十进制数转换为二进制数函数setnum(int num) 各函数间关系如下:

四,详细设计 1,顺序表的结构类型定义: typedef struct{ int data[maxlen]; int top; }seqstack; 2,顺序栈入栈函数的伪代码: void push(seqstack *s,int x){ if(s->top<=maxlen-1&&s->top>=-1){ s->top++; s->data[s->top]=x;} else printf("error");} 3,顺序栈出栈函数的伪代码: void pop(seqstack *s){ if(s->top>=0) s->top--; else printf("error"); } 4,将十进制数转换为二进制数函数伪代码: void setnum(int num){ seqstack s; initstack(&s); while(num){ int k=num%2; push(&s,k); num=num/2;} while(!stackempty(&s)){ int x=gettop(&s); printf("%d",x); pop(&s); } } 五,源代码 #include "stdio.h" #define maxlen 100 typedef struct{ //定义顺序栈的结构类型 int data[maxlen]; int top; }seqstack; int stackempty(seqstack *s){ //顺序栈判栈空算法if(s->top>=0) return 0; else return 1; } seqstack *initstack(seqstack *s){ //顺序栈置空栈算法s->top=-1; return s; }

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

数据结构练习第三章栈和队列 一、选择题 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.队列的插入操作是在()进行。

数据结构

《数据结构》综合复习资料 一、填空题 1.数据结构是()。 2.堆栈的特点是(),队列的特点是(),字符串中的数据元素为()。 3.列举三种树的存储方式()、()和()。 4.哈希表查找技术的性能取决于三个因素,它们是()、()和()。 5.ADT称为抽象数据类型,它是指()。 6.求下列程序的时间复杂度,并用大O表示方法表示()。 for( i=1 ; i<=n ; + + i) for( j=1 ; j<=i; + + j ) { ++x; a[i][j] = x; } 7.用堆栈求中缀表达式a+b*c/d+e*f的后缀表达式,求出的后缀表达式为()。 8.含零个字符的串称为()串,用 表示。其他串称为()串。任何串中所含字符的个数称为该串的()。 9.设有字母序列{Q,D,F,X,A,P,N,B,,Y,M,C,W},请写出按2路归并排序方法对该序列进行一趟排序后的结果()。 10.数据的逻辑结构被分为()、()、()和()四种。 11.算法设计的评价标准为()、()、()、()。 12.在线性表的单链接存储中,若一个元素所在结点的地址为p,则其后继结点的地址为(),若假定p为一个数组a中的下标,则其后继结点的下标为()。 13.()通常称作串的模式匹配。在一个主串中查找子串是否存在,存在返回();不存在返回( )。 14.在一棵二叉树中,第5层上的结点数最多为();在一棵二叉树中,假定双分支结点数为5个,单分支结点数为6个,则叶子结点数为()个。 15.对于一个具有n个顶点和e条边的无向图,当分别采用邻接矩阵、邻接表表示时,求任一顶点度数的时间复杂度依次为()、()。 16.给出一组关键字序列{29,18,25,47,58,12,15,10},增量为4的希尔(SHELL)排序结果为()。 17.数据结构的四种基本形式为集合、()、()和()。 18.线性表的常见链式存储结构有()、()和()。 19.设T是一个m*n阶矩阵,T按列序存储在一组连续的存储单元中,每个元素占用w个存储单元,若T[1,1]的存储地址为base,则T[i,j]的存储地址为()。 20.在邻接表上,无向图中顶点vi的度恰为()。对有向图,顶点vi的出度是()。为了求入度,必须遍历整个邻接表,在所有单链表中,其邻接点域的值为()的结点的个数是顶点vi的入度。

数据结构实验报告栈进制转换

数据结构试验报告栈的应用——进制转换程序

if(s->top - s->base >= STACK_INIT_SIZE) { s->base=(int *)realloc(s->base , (s->stacksize + STACKINCREMENT) * sizeof(int) ); if(!s->base) { exit(OVERFLOW); } s->top=s->base + STACKINCREMENT; } * s->top ++ = *e; return OK; } 3.出栈程序 int Pop(Stack *s , int *e) { if(s->top == s->base) { return ERROR; } *e = * -- s->top; return OK;

} 4.主函数与进制转化 void main() { int N; int a; int e; Stack s; InitStack(&s); Pop(&s , &e); Push(&s ,&e); InitStack(&s); printf("请输入十进制数:"); scanf("%d",&N); printf("要将N转化为几进制"); scanf("%d",&a); while(N) { e=N%a; Push( &s , &e ); N = N / a ; }

int *base; int *top; int stacksize; }Stack; int InitStack(Stack *s) { s->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!s->base) { exit(OVERFLOW); } s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int Push(Stack *s , int *e) { if(s->top - s->base >= STACK_INIT_SIZE) { s->base=(int *)realloc(s->base , (s->stacksize + STACKINCREMENT) * sizeof(int) );

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

实验编号: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、顺序储存: ?代码部分: //Main、cpp: #include"SStack、h" int main() { SqStack S; SElemType e;

int elect=1; InitStack(S); cout << "已经创建一个存放字符型得栈" << endl; while (elect) { Muse(); cin >> elect; cout << endl; switch (elect) { case 1: cout << "input data:"; cin >> e; Push(S, e); break; case 2: if(Pop(S, e)) {cout << e <<" is pop"<< endl; } else{cout<<"blank"<

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

习题三栈和队列 一单项选择题 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

数据结构栈和队列

实验二栈和队列 一、实验目的 1. 掌握栈的顺序表示和实现 2. 掌握队列的链式表示和实现 二、实验内容 1. 编写一个程序实现顺序栈的各种基本运算。 2. 实现队列的链式表示和实现。 三、实验步骤 1. 初始化顺序栈 2. 插入元素 3. 删除栈顶元素 4. 取栈顶元素 5. 遍历顺序栈 6. 置空顺序栈 7. 初始化并建立链队列 8. 入链队列 9. 出链队列 10. 遍历链队列 四、实现提示 1. /*定义顺序栈的存储结构*/ typedef struct { ElemType stack[MAXNUM]; int top; }SqStack; /*初始化顺序栈函数*/ void InitStack(SqStack *p) {q=(SqStack*)malloc(sizeof(SqStack) /*申请空间*/) /*入栈函数*/ void Push(SqStack *p,ElemType x)

{if(p->toptop=p->top+1; /*栈顶+1*/ p->stack[p->top]=x; } /*数据入栈*/ } /*出栈函数*/ ElemType Pop(SqStack *p) {x=p->stack[p->top]; /*将栈顶元素赋给x*/ p->top=p->top-1; } /*栈顶-1*/ /*获取栈顶元素函数*/ ElemType GetTop(SqStack *p) { x=p->stack[p->top];} /*遍历顺序栈函数*/ void OutStack(SqStack *p) { for(i=p->top;i>=0;i--) printf("第%d个数据元素是:%6d\n",i,p->stack[i]);} /*置空顺序栈函数*/ void setEmpty(SqStack *p) { p->top= -1;} 2. /*定义链队列*/ typedef struct Qnode { ElemType data; struct Qnode *next; }Qnodetype; typedef struct { Qnodetype *front; Qnodetype *rear; }Lqueue; /*初始化并建立链队列函数*/ void creat(Lqueue *q)

堆栈、栈(stack)和堆(heap)三者的区别

一、预备知识(程序的内存分配) 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,其分配方式倒是类似于链表。 3、全局区(静态区static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。 4、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。 5、程序代码区:存放函数体的二进制代码。 看看下面的例子程序,这是一个前辈写的,非常详细。 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0;全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 } 二、堆和栈的理论知识 2.1、申请方式 stack:由系统自动分配。例如:声明在函数中一个局部变量int b,系统自动在栈中为b开辟空间。heap:需要程序员自己申请,并指明大小,在c中用malloc函数,如p1 = (char *)malloc(10); 在C++中用new运算符:如p2 = (char *)malloc(10); 但是注意p1、p2本身是在栈中的。 2.2 、申请后系统的响应 stack:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报错提示栈溢出。heap:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小。这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 2.3、申请大小的限制 stack:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是

《数据结构练习题》栈和队列

栈和队列 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);

数据结构实验-栈的基本运算

******************************* 实验题目:栈的基本运算 实验者信息: 班级13007102,姓名庞文正,学号1300710226 实验完成的时间3:00 ****************************** 一、实验目的 1,掌握栈的各种存储结构及基本运算的实现。 2,掌握堆栈后进先出的运算原则在解决实际问题中的应用。3,复习c语言中相关语句及函数的用法。 二、实验内容 括号配对检查。试设计一个程序对任意输入的语句或数学表达式,判断其括号是否匹配。若匹配,则返回1,否则返回0。调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对算法的理解。 三、算法设计与编码 1.本实验用到的理论知识 总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,最好能加上自己的解释。 2.算法概要设计

给出实验的数据结构描述,程序模块、功能及调用关系首先建立一个栈结构,且初始化栈为空。然后由键盘上随即输入一个带括号的语句或带括号的数学表达式,同时将它们保存在一个字符型数组exps[]中。扫描表达式exps,当遇到“(”、“[”、“{”时,将其入栈。遇到“)”、“]”、“}”时,判断栈顶是否有相匹配的括号。若没有,则退出扫描过程,返回0,否则直到exps扫描完毕为止。若top为0,则返回1。 #include #define MAXSIZE 100 #define TRUE 1 #define FALSE 0 typedef int datatype; typedef struct //顺序栈的结构体定义 { datatype stack[MAXSIZE]; int top; }seqstack; void setnull(seqstack *s) //置空栈-由于c语言的数组下标是从0开始的,所以置

数据结构-栈和队列-实验

实验三栈和队列 一、目的和要求 1. 掌握栈和队列的逻辑结构定义和各种存储结构的实现。 2. 熟练运用栈和队列的各种存储结构以及各种基本操作。 3. 根据实际问题的需要,选择栈和队列适合的存储结构解决问题。 二、实验环境 1.WindowsXP操作系统; 2.DEV C++、Visual C++6.0语言环境; 三、实验内容 (一)验证性实验(第1、4题为一组;第2、3题为另一组,每个同学选择一组完成。每个小题一个文件夹,所有文件夹打在一个包中,文件名:“学号”+“姓名”,例如: 13131000张三.rar 。提交码为2014DS3,截止时间:2014年12月14日12:00时。) 1.顺序栈的验证 (1)定义一个结构体,描述停车场中车辆的信息。车辆信息包括:车牌号(8个字符)、进场时间(年、月、日、时、分、秒)。用描述车辆信息的结构体作为栈的数据元素类型测试顺序栈的实现。 (2)修改顺序栈的入栈成员函数push(x),要求当栈满时,执行私有成员函数stackfull( )进行栈满处理。其功能是:动态创建一个比原来的栈数组大一倍的新数组,代替原来的栈数组,原来栈数组中的元素占据新数组的前半部分的位置。 2.链式栈的验证 (1)定义一个结构体,描述停车场中车辆的信息。车辆信息包括:车牌号(8个字符)、进场时间(年、月、日、时、分、秒)。用描述车辆信息的结构体作为栈的数据元素类型测试链式栈的实现。 (2)修改链式栈模板类,用带头结点的单链表作为栈的存储结构。 3.循环队列的验证 (1)定义一个结构体,描述银行排队系统中的客户信息。客户信息包括:客户号、客户类型(企业客户、VIP客户、普通客户)、到达时间(年、月、日、时、分、秒)等。用描述客户信息的结构体作为队列的数据元素类型测试循环队列的实现。 (3)修改教材中循环队列模板类,把成员数据rear改为length表示队列长度,完成修改后各成员函数的实现,并进行测试验证。 4.链队列的验证 (1)定义一个结构体,描述航空订票系统中的航班信息。航班信息包括:航班号、起飞时间(年、月、日、时、分、秒)、起飞地点(8个字符)、抵达时间(年、月、日、时、分、秒)、抵达地点(8个字符)、座位数、空位数、票价等。用描述航班信息的结构体作为队列的数据元素类型测试链队列的实现。 (2)修改教材中的链队列模板类,用一个不带头结点的单循环链表来表示队列(也称为循环链队列),其中只设一个队尾指针rear,不设队头指针,队尾指针rear指向队尾元素结点。

数据结构实验报告顺序栈

(封面) 学生实验报告 学院:国际经贸学院 课程名称:数据结构 专业班级:09电子商务 姓名: 学号: 学生实验报告 (经管类专业用) 一、实验目的及要求: 1、目的 通过实验,实现顺序栈的各种基本运算。 2、内容及要求 编写一个程序,实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成下列功能: (1)初始化栈S。 (2)判断栈S是否非空。 (3)依次进栈元素a,b,c,d,e。 (4)判断栈S是否非空。 (5)输出栈的长度。

(6)输出从栈顶到栈底的元素。 (7)输出出栈序列; (8)判断链栈S是否为空; (9)释放链栈 二、仪器用具: 三、实验方法与步骤: 一、查阅顺序栈等相关资料,熟悉顺序栈基本概念和流程 二、“开展”顺序栈实验流程 三、整理实验数据和文档,总结实验的过程,编写实验报告 四、实验结果与数据处理: 1、顺序栈的代码: #include #include #define MaxSize 100 typedef char ElemType; typedef struct { ElemType data[MaxSize]; int top; //栈顶指针 } SqStack; void InitStack(SqStack *&s) { s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; }

void ClearStack(SqStack *&s) { free(s); } int StackLength(SqStack *s) { return(s->top+1); } int StackEmpty(SqStack *s) { return(s->top==-1); } int Push(SqStack *&s,ElemType e) { if (s->top==MaxSize-1) return 0; s->top++; s->data[s->top]=e; return 1; } int Pop(SqStack *&s,ElemType &e) { if (s->top==-1) return 0; e=s->data[s->top]; s->top--; return 1; } int GetTop(SqStack *s,ElemType &e) {

数据结构第3章栈与队列习题

第3章栈与队列 一、单项选择题 1.元素A、B、C、D依次进顺序栈后,栈顶元素是,栈底元素是。 A.A B.B C.C D.D 2.经过以下栈运算后,x的值是。 InitStack(s);Push(s,a);Push(s,b);Pop(s,x);GetTop(s,x); A.a B.b C.1 D.0 3.已知一个栈的进栈序列是ABC,出栈序列为CBA,经过的栈操作是。 A.push,pop,push,pop,push,pop B.push,push,push,pop,pop,pop C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop 4.设一个栈的输入序列为A、B、C、D,则借助一个栈所得到的序列是。 A.A,B,C,D B.D,C,B,A C.A,C,D,B D.D,A,B,C 5.一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是。 A.edcba B.decba C.dceab D.abcde 6.已知一个栈的进栈序列是1,2,3,……,n,其输出序列的第一个元素是i,则第j个出栈元素是。 A.i B.n-i C.j-i+1 D.不确定 7.已知一个栈的进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,Pn,若p1=n,则pi的值。 A.i B.n-i C.n-i+1 D.不确定 8.设n个元素进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,p n,若p1=3,则p2的值。 A.一定是2 B.一定是1

C.不可能是1 D.以上都不对 9.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p3=1,则p1的值。 A.可能是2 B.一定是1 C.不可能是2 D.不可能是3 10.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p3=3,则p1的值。 A.可能是2 B.一定是2 C.不可能是1 D.一定是1 11.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p n=1,则p i(1≤i≤n-1)的值。 A.n-i+1 B.n-i C.i D.有多种可能 12.判定一个顺序栈S为空的条件为。 A.S.top= =S.base B.S.top!= S.base C.S.top!= S.base+S.stacksize D.S.top= = S.base+S.stacksize 13.判定一个顺序栈S为栈满的条件是。 A.S.top-S.base= =S.stacksize B.S.top= = S.base C.S.top-S.base!=S.stacksize D.S.top!= S.base 14.链栈与顺序栈相比有一个明显的优点,即。 A.插入操作方便B.通常不会出现栈满的情况 C.不会出现栈空的情况D.删除操作更加方便 15.最不适合用作链栈的链表是。 A.只有表头指针没有表尾指针的循环双链表 B.只有表尾指针没有表头指针的循环双链表 C.只有表尾指针没有表头指针的循环单链表 D.只有表头指针没有表尾指针的循环单链表 16.如果以链表作为栈的存储结构,则退链栈操作时。 A.必须判别链栈是否满B.判别链栈元素的类型 C.必须判别链栈是否空D.对链栈不作任何判别

相关文档
最新文档