线性表、栈、队列

合集下载

线性表-链接存储的栈和队列

线性表-链接存储的栈和队列
3.
索引存储的优点
查寻某个结点k,无须遍查F中的所有结点。 只需根据结点k的性质p,计算索引函数求 得i,从索引表中找到结点xi,得到子线性 表Fi的首地址。然后在线性表Fi中查找这 个结点k。
1.6.2 索引存储
4. 存储方法 (1)顺序-索引-链接,即索引表为顺序存储, 子线性表为链接存储。(常用) (2)顺序-索引-顺序,即索引表与子线性表 均为顺序存储。 (3)链接-索引-链接,即索引表与子线性表 均为链接存储。 (4)链接-索引-顺序,即索引表为链接存储, 子线性表为顺序存储。
1.6.3 散列存储
1.
概念 散列存储(也称Hash存储),通过对结点的 键值作某种运算来确定具有此结点的存放位置。 设有线性表F=(k0, k1, …, kn-1)和数组T[m], 而结点ki的键值为keyi,若h(x)是键值集合到 整数0至m-1的一个一一对应函数。对于任意 结点ki在数组T[m]中的存放位置由h(keyi)决定, 这种存放结点的方法,称为散列(Hash)存储。 函数h(x)为散列函数,数组T[m]为散列表。
9
1.6.3 散列存储
2.
问题 (1)难于选取一个从键值集合到散列表地 址空间的一一对应的函数h(x),即对于 keyi≠keyj,有可能h(keyi)=h(keyj)。这种 情况称为冲突。 (2)一旦有冲突,应选取怎样的解决方法?
这些问题留待以后解决。
0 7 78
12 9
2
-9
4 11 93
3 ^
-61
1.6.1 线性表的压缩存储
3.
压缩存储的优缺点 优点:当相同取值的结点数量较多时, 可节省存储空间。 缺点:给定序号,要求查寻相应结点, 比较困难。对于顺序存储,可用两分查 找法;对于链接存储,就需扫描几乎全 部结点。

线性表栈和队列

线性表栈和队列

while( p !=NULL && j < i ) { p=p->link; j++; } // 指向第i结点,i=0,1,…,当链表 //中结点数小于i时返回NULL return p; }
单链表插入算法
// 插入数据内容为value的新结点,为第i个 结点。 ListNode * Insert(ELEM value, int i) { ListNode *p,*q; q = new ListNode; p = FindIndex(i-1); if(p == NULL ) return NULL;
}
2.2.2

Байду номын сангаас
向量的运算
插入元素运算

void insert( item) ELEM remove( )

删除元素运算

插入算法
/*(设元素的类型为ELEM,nodelist是存储顺序表的 向量, msize 是此向量的最大长度, curr_len 是此向 量的当前长度,curr为此向量当前下标)*/ #include <assert.h> viod insert(ELEM item) { //需要检查当前长度不能等于msize,当前游标指针 //curr不能小于0,也不能大于当前长度
q->link = p->link; q->data = value; p->link = q; if(q->link == NULL ) last=q; return q;
}
插入过程
单链表删除算法
//删除由参数link所指定的结点
void RemoveAfter(ListNode * link) { ListNode *newlink=link; if(link!=NULL) link=link->link; delete newlink; }

数据结构--栈和队列基础知识

数据结构--栈和队列基础知识

数据结构--栈和队列基础知识⼀概述栈和队列,严格意义上来说,也属于线性表,因为它们也都⽤于存储逻辑关系为 "⼀对⼀" 的数据,但由于它们⽐较特殊,因此将其单独作为⼀篇⽂章,做重点讲解。

既然栈和队列都属于线性表,根据线性表分为顺序表和链表的特点,栈也可分为顺序栈和链表,队列也分为顺序队列和链队列,这些内容都会在本章做详细讲解。

使⽤栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈;使⽤队列存储数据,讲究 "先进先出",即最先进队列的数据,也最先出队列。

⼆栈2.1 栈的基本概念同顺序表和链表⼀样,栈也是⽤来存储逻辑关系为 "⼀对⼀" 数据的线性存储结构,如下图所⽰。

从上图我们看到,栈存储结构与之前所了解的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求:1. 栈只能从表的⼀端存取数据,另⼀端是封闭的;2. 在栈中,⽆论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。

拿图 1 的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。

因此,当需要从栈中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。

因此,我们可以给栈下⼀个定义,即栈是⼀种只能从表的⼀端存取数据且遵循 "先进后出" 原则的线性存储结构。

通常,栈的开⼝端被称为栈顶;相应地,封⼝端被称为栈底。

因此,栈顶元素指的就是距离栈顶最近的元素,拿下图中的栈顶元素为元素 4;同理,栈底元素指的是位于栈最底部的元素,下中的栈底元素为元素 1。

2.2 进栈和出栈基于栈结构的特点,在实际应⽤中,通常只会对栈执⾏以下两种操作:向栈中添加元素,此过程被称为"进栈"(⼊栈或压栈);从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);2.3 栈的具体实现栈是⼀种 "特殊" 的线性存储结构,因此栈的具体实现有以下两种⽅式:1. 顺序栈:采⽤顺序存储结构可以模拟栈存储数据的特点,从⽽实现栈存储结构。

第三章 栈和队列

第三章 栈和队列

栈和队列的基本操作是线性表操作的子集,是限定性(操作受限制)的数据结构。

第三章栈和队列数据结构之栈和队列23. 1 栈¾定义:是限定仅在表尾进行插入或删除操作的线性表。

(后进先出线性表LIFO)¾栈底指针(base) :是线性表的基址;¾栈顶指针(top):指向线性表最后一个元素的后面。

¾当top=base 时,为空栈。

¾基本操作:InitStack(&S), DestroyStack(&S),StackEmpty(S) , ClearStack(&S),GetTop(S ,&e), StackLength(S) ,Push(&S, e): 完成在表尾插入一个元素e.Pop(&S,&e): 完成在表尾删除一个元素。

数据结构之栈和队列3¾栈的表示和实现¾顺序栈:是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;栈满之后,可再追加栈空间即为动态栈。

¾顺序栈的结构类型定义:typedef int SElemType;typedef struct{SElemType *base; /* 栈底指针*/SElemType *top; /* 栈顶指针*/int stacksize; /* 栈空间大小*/ }SqStack;数据结构之栈和队列4¾基本算法描述¾建立能存放50个栈元素的空栈#define STACK_INIT_SIZE 50#define STACKINCREMENT 10Status InitStack_Sq(Stack &S){S.base=(SET*)malloc(STACK_INIT_SIZE *sizeof(SET)); /*为栈分配空间*/if(S.base==NULL)exit(OVERFLOW); /*存储分配失败*/ S.top=S.base;S.stacksize = STACK_INIT_SIZE;return OK; }数据结构之栈和队列5¾出栈操作算法void pop(Sqstack s,SElemType e){if(s.top= = s.base)return ERROR;else{s.top--;e= *s.top;}return OK;}出栈操作topABY topABYbase base数据结构之栈和队列6¾压栈操作算法void Push(SqStack s,SElemType e)if(s.top-s.base>= S.stacksize;) {S.base=(SET*)realloc(S,base,(S.stacksize+STACKINCREMEN T) *sizeof(SET)); /*为栈重新分配空间*/if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top=e;S.top++;}return OK; }topAB压栈操作topABebase base数据结构之栈和队列7¾栈的销毁void DestroyStack_Sq(Stack &S){ if (S.base) free(S.base);S.base=NULL;S.top=NULL;S.stacksize=0;}¾栈的清除void ClearStack_Sq(Stack &S){ S.top = S.base ;}数据结构之栈和队列8¾判断栈是否为空栈Status StackEmpty_Sq(Stack S){ if(S.top==S.base) return TRUE;else return FALSE;}¾获得栈的实际长度int StackLength_Sq(Stack S){return(abs(S.top-S.base));}数据结构之栈和队列9¾多个栈共享邻接空间两个栈共享一空间::::::top1top21m中间可用空间栈1栈2地址Base1Base 2……数据结构之栈和队列103. 3 栈与递归¾递归函数:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数。

数据结构(C++版)第3章 特殊线性表

数据结构(C++版)第3章 特殊线性表

特殊线性表——栈
3.1.3 栈的链接存储结构及实现
链栈:栈的链接存储结构 first
a1
a2
ai
an ∧
将哪一端作为栈顶? 将链头作为栈顶,方便操作。 链栈需要加头结点吗? 链栈不需要附设头结点。
特殊线性表——栈
栈的链接存储结构及实现
链栈:栈的链接存储结构 first top an
栈顶
a1
a2 a1 ∧
Pop( );
an
an-1
a1 ∧
特殊线性表——栈
顺序栈和链栈的比较
时间性能:相同,都是常数时间O(1)。
空间性能: 顺序栈:有元素个数的限制和空间浪费的问题。 链栈:没有栈满的问题,只有当内存没有可用空间时才会 出现栈满,但是每个元素都需要一个指针域,从而产生了 结构性开销。 结论:当栈的使用过程中元素个数变化较大时,用链栈是适 宜的,反之,应该采用顺序栈。
两栈共享空间
两栈共享空间
0 1 2 ……
S-1
a 1 a2 … ai
栈1底
bj … … b2 b 1
top2
栈2底
top1
栈1的底固定在下标为0的一端; 栈2的底固定在下标为StackSize-1的一端。 top1和top2分别为栈1和栈2的栈顶指针; Stack_Size为整个数组空间的大小(图中用S表示);
an
an-1
p
a1 ∧ top++可以吗?
特殊线性表——栈
链栈的实现——链栈的析构(链栈的销毁)
template <class T> LinkStack<T>::~LinkStack( ) {
Node<T> *p;

吉林大学数据结构_第二章 线性表

吉林大学数据结构_第二章 线性表

如何找指定位置的结点?
• 与顺序表不同,单链表无法直接访问指定 位置的结点,而是需要从哨位结点开始, 沿着next指针逐个结点计数,直至到达指定 位置。
操作
• • • • 存取 查找 删除 插入
存取算法
算法Find(k.item) /*将链表中第k个结点的字段值赋给item*/ F1. [k合法?] IF (k<1) THEN (PRINT “存取位置不合法”. RETURN.) F2. [初始化] p←head. i ←0. F3. [找第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) item←data(p). ▍ 存取算法的时间复杂性分析。P30
插入算法
算法Insert(k,item) /*在链表中第k个结点后插入字段值为item的结点*/ I1.[k合法?] IF (k<0) THEN (PRINT “插入不合法”. RETURN) I2.[初始化] p←head. i ←0. I3.[p指向第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “插入不合法”. RETURN. ) I4.[插入] s<= AVAIL. data(s) ←item. next(s) ←next(p). next(p) ←s. ▍
删除算法
算法Delete(k.item) /*删除链表中第k个结点并将其字段值赋给item*/ D1.[k合法?] IF (k<1) THEN (PRINT “删除不合法”. RETURN.) D2.[初始化] p←head. i ←0. D3.[找第k-1结点] WHILE (p ≠NULL AND i<k-1) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) D4.[删除] q ← next(p). next(p) ← next(q) . item←data(q). AVAIL<=q.▍

数据结构C语言版部分习题及答案[2]

数据结构C语言版部分习题及答案[2]

第二章习题与解答一判断题1.线性表的逻辑顺序与存储顺序总是一致的。

2.顺序存储的线性表可以按序号随机存取。

3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。

4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。

5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。

6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。

7.线性表的链式存储结构优于顺序存储结构。

8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。

9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。

10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。

二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( ) 。

(A) 一个有限序列,可以为空;(B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空;(D) 一个无序序列,不能为空。

2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。

插入一个元素时平均要移动表中的()个元素。

(A) n/2 (B) n+1/2 (C) n -1/2 (D) n3.线性表采用链式存储时,其地址( ) 。

(A) 必须是连续的;(B) 部分地址必须是连续的;(C) 一定是不连续的;(D) 连续与否均可以。

4.用链表表示线性表的优点是()。

(A)便于随机存取(B)花费的存储空间较顺序存储少(C)便于插入和删除(D)数据元素的物理顺序与逻辑顺序相同5.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。

(A)单链表(B)双链表(C)单循环链表(D)带头结点的双循环链表6.循环链表的主要优点是( )。

(A)不在需要头指针了(B)已知某个结点的位置后,能够容易找到他的直接前趋(C)在进行插入、删除运算时,能更好的保证链表不断开(D)从表中的任意结点出发都能扫描到整个链表7.下面关于线性表的叙述错误的是( )。

数据结构(一)——线性表、栈和队列

数据结构(一)——线性表、栈和队列

数据结构(⼀)——线性表、栈和队列数据结构是编程的起点,理解数据结构可以从三⽅⾯⼊⼿:1. 逻辑结构。

逻辑结构是指数据元素之间的逻辑关系,可分为线性结构和⾮线性结构,线性表是典型的线性结构,⾮线性结构包括集合、树和图。

2. 存储结构。

存储结构是指数据在计算机中的物理表⽰,可分为顺序存储、链式存储、索引存储和散列存储。

数组是典型的顺序存储结构;链表采⽤链式存储;索引存储的优点是检索速度快,但需要增加附加的索引表,会占⽤较多的存储空间;散列存储使得检索、增加和删除结点的操作都很快,缺点是解决散列冲突会增加时间和空间开销。

3. 数据运算。

施加在数据上的运算包括运算的定义和实现。

运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。

因此,本章将以逻辑结构(线性表、树、散列、优先队列和图)为纵轴,以存储结构和运算为横轴,分析常见数据结构的定义和实现。

在Java中谈到数据结构时,⾸先想到的便是下⾯这张Java集合框架图:从图中可以看出,Java集合类⼤致可分为List、Set、Queue和Map四种体系,其中:List代表有序、重复的集合;Set代表⽆序、不可重复的集合;Queue代表⼀种队列集合实现;Map代表具有映射关系的集合。

在实现上,List、Set和Queue均继承⾃Collection,因此,Java集合框架主要由Collection和Map两个根接⼝及其⼦接⼝、实现类组成。

本⽂将重点探讨线性表的定义和实现,⾸先梳理Collection接⼝及其⼦接⼝的关系,其次从存储结构(顺序表和链表)维度分析线性表的实现,最后通过线性表结构导出栈、队列的模型与实现原理。

主要内容如下:1. Iterator、Collection及List接⼝2. ArrayList / LinkedList实现原理3. Stack / Queue模型与实现⼀、Iterator、Collection及List接⼝Collection接⼝是List、Set和Queue的根接⼝,抽象了集合类所能提供的公共⽅法,包含size()、isEmpty()、add(E e)、remove(Object o)、contains(Object o)等,iterator()返回集合类迭代器。

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

1.线性表的顺序存储结构是一种的存储结构,而链式存储结构是一种___的存储结构。

A.随机存取B.索引存取C.顺序存取D.散列存取
2.线性表若采用链式存储结构时,要求内存中可用存储单元的地址___。

A. 必须是连续的
B. 部分地址必须是连续的
C. 一定是不连续的
D. 连续或不连续都可以
3.在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s
结点,则执行____。

A. s->next=p->next; p->next=s;
B. p->next=s->next; s->next=p;
C. q->next=s; s->next=p;
D. p->next=s; s->next=q;
4.在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行____。

A. s->next=p; p->next=s;
B. s->next=p->next; p->next=s;
C. s->next=p->next; p=s;
D. p->next=s; s->next=p;
5.在一个单链表中,若删除p所指结点的后续结点,则执行____。

A. p->next= p->next->next;
B. p= p->next; p->next= p->next->next;
C. p->next= p->next;
D. p= p->next->next;
6.链表不具备的特点是____ 。

A可随机访问任何一个元素 B 插入、删除操作不需要移动元素
C 无需事先估计存储空间大小
D 所需存储空间与线性表长度成正比
7.一个队列的数据入列序列是1,2,3,4,则队列的出队时输出序列是____ 。

A4,3,2,1 B 1,2,3,4 C 1,4,3,2 D 3,2,4,1 8.栈与一般线性表区别主要在方面。

A元素个数 B 元素类型 C 逻辑结构 D 插入、删除元素的位置
9.在一个链队中,假设F和R分别是队首和队尾指针,则删除一个结点的运算是。

A R=F->next;
B R=R->next;
C F=F->next;
D F=R->next;
10. 数据三种最主要的逻辑结构是线性结构和()。

A. 线性表、树
B. 树形结构、图状结构
C. 线性表、图
D. 树形结构、堆
1.数据结构的存储结构包括:索引存储表示和散列存储表
示等四大类。

2.在线性结构中,第一个结点没有
3.实现字符串逆序(既输入如“ABC”,输出为“CBA”
4.银行柜面服务遵循“先来先服务”
种行为
5.线性表第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是
6.
7.
8.在一个长度为n的顺序表中删除第i个元素,要移动i个元素
前插入一个元素,要后移
9.
10.
11.栈和队列都是结构;对于栈只能在插入和删除元素;对于队列只能在
插入元素和删除元素。

12.
13.设将整数1,2,3,4进栈,若入、出栈次序为Push, Pop,Push,Push, Pop, Pop,Push, Pop,
则出栈的数字序列为若想得到出栈序列1432
14.在采用少用一个存储空间的具有n个单元的循环队列中,队满时共有对于
下图所示的循环队列,队满的条件是
三、设计题
1.已知str是一个非空字符串,编写算法通过在临时栈S和队列Q中缓存数据,判处字符
串str是否为回文,算法采用文字描述。

①将串str分别入队Q中和入栈S中
②将Q的队头元素出队至变量tq中,将S的栈顶元素出栈至变量ts中
③若tq==ts,重复步骤②;若tq!=ts,则退出循环,return 0表示str不是回文
④return 1表示str是回文
2.设计函数Node * Find(Node *Head, int item),Head为带头结点单链表的头指针,在传入
的链表中查找值为item的结点并返回其地址,如不存在这样的结点则返回空值NULL。

其中结点的类型声明如下:
struct Node
{
int data;
Node *next;
};
Node * Find(Node *Head, int item)
{
Node *p=Head->next;
while(p!=NULL)
{
if(p->data == item)
return p; //查找成功
p=p->next;
}
return NULL; //查找失败
}。

相关文档
最新文档