栈和队列的进出规则

合集下载

数据结构——用C语言描述(第3版)教学课件第3章 栈和队列

数据结构——用C语言描述(第3版)教学课件第3章 栈和队列

if(S->top==-1) /*栈为空*/
return(FALSE);
else
{*x = S->elem[S->top];
return(TRUE);
}
返回主目录}[注意]:在实现GetTop操作时,也可将参数说明SeqStack *S 改为SeqStack S,也就是将传地址改为传值方式。传 值比传地址容易理解,但传地址比传值更节省时间、 空间。
返回主目录
算法:
void BracketMatch(char *str) {Stack S; int i; char ch; InitStack(&S); For(i=0; str[i]!='\0'; i++) {switch(str[i])
{case '(': case '[': case '{':
3.1.3 栈的应用举例
1. 括号匹配问题
思想:在检验算法中设置一个栈,若读入的是左括号, 则直接入栈,等待相匹配的同类右括号;若读入的是 右括号,且与当前栈顶的左括号同类型,则二者匹配, 将栈顶的左括号出栈,否则属于不合法的情况。另外, 如果输入序列已读尽,而栈中仍有等待匹配的左括号, 或者读入了一个右括号,而栈中已无等待匹配的左括 号,均属不合法的情况。当输入序列和栈同时变为空 时,说明所有括号完全匹配。
return(TRUE);
}
返回主目录
【思考题】
如果将可利用的空闲结点空间组织成链栈来管理,则申 请一个新结点(类似C语言中的malloc函数)相当于链 栈的什么操作?归还一个无用结点(类似C语言中的 free函数)相当于链栈的什么操作?试分别写出从链栈 中申请一个新结点和归还一个空闲结点的算法。

第三章 栈和队列

第三章 栈和队列

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

第三章栈和队列数据结构之栈和队列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 栈与递归¾递归函数:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数。

第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社

第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社

an
队头
队尾
队列示意图
入队
13
2、队列的基本运算
初始化队列 INIQUEUE(&Q)
将队列Q设置成一个空队列。
入队列
ENQUEUE(&Q,X)
将元素X插入到队尾中,也称“进队” ,“插入”。
出队列
DLQUEUE(&Q)
将队列Q的队头元素删除,也称“退队”、“删除”。
取队头元素 GETHEAD(Q)
也就是说,栈是一种后进先出(Last In First Out)的线性表,简称为LIFO表。
3
2、栈的运算
初始化栈:INISTACK(&S)
将栈S置为一个空栈(不含任何元素)。
进栈:PUSH(&S,X)
将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压 入”。
出栈: POP(&S)
删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹 出”。
9
三、链栈
typedef struct Lsnode { ElemType data;
struct Lsnode *next; } Lsnode *top;
一个链表栈由ቤተ መጻሕፍቲ ባይዱ顶指针top唯一确定。
10
1、链栈的主要运算
进栈操作 void Push(Lsnode *top; ElemType x)
{ p=(Lsnode *)malloc(sizeof(Lsnode)); p->data=x; p->next=top->next; top->next=p; }/*Push*/
第3章 栈和队列
1
栈和队列是二种特殊的线性表。是操作受 限的线 性表。 一、栈

数据结构第六次课-栈和队列B

数据结构第六次课-栈和队列B
例4:表达式求值
设计思路:用栈暂存运算符
第4页
❖回文游戏:顺读与逆读字符串一样(不含空格)
1.读入字符串
d
top 2.压入栈
a
3.原串字符与出栈字符依次比较
d
若不等,非回文
字符串:“madam I madam”
若直到栈空都相等,则是回文
“上海自来水来自海上” 有没有更简洁的办法呢?
(读入字符串,压入n/2个字符,n为字符个数)
第8页
表达式表示法
算术表达式中最常见的表示法形式有 中缀、前缀
和 后缀表示法。中缀表示法是书写表达式的常见方式,
而前缀和后缀表示法主要用于计算机科学领域。
➢中缀表示法 Syntax: operand1 operator operand2 Example: (A+B)*C-D/(E+F) ➢前缀表示法 -波兰表示法(Polish notation,PN) Syntax : operator operand1 operand2 Example : -*+ABC/D+EF ➢后缀表示法 -逆波兰表示法(Reverse Polish Notation,RPN) Syntax : operand1 operand2 operator Example : AB+C*DEF+/- 无操作符优先级问题,求值简单
第7页
❖ 表达式求值( 这是栈应用的典型例子 )
这里,表达式求值的算法是 “算符优先法”。
例如:3*(7 – 2 ) (1) 要正确求值,首先了解算术四则运算的规则:
a. 从左算到右 b. 先乘除,后加减 c. 先括号内,后括号外 由此,通常此表达式的计算顺序为:
3*(7 – 2 )= 3 * 5 = 15

《数据结构(C语言)》第3章 栈和队列

《数据结构(C语言)》第3章 栈和队列
Data structures

❖ 栈的顺序存储与操作 ❖ 1.顺序栈的定义
(1) 栈的静态分配顺序存储结构描述 ② top为整数且指向栈顶元素 当top为整数且指向栈顶元素时,栈空、入栈、栈满 及出栈的情况如图3.2所示。初始化条件为 S.top=-1。
(a) 栈空S.top==-1 (b) 元素入栈S.stack[++S.top]=e (c) 栈满S.top>=StackSize-1 (d) 元素出栈e=S.stack[S.top--]
/*栈顶指针,可以指向栈顶
元素的下一个位置或者指向栈顶元素*/
int StackSize; /*当前分配的栈可使用的以 元素为单位的最大存储容量*/
}SqStack;
/*顺序栈*/
Data structures

❖ 栈的顺序存储与操作 ❖ 1.顺序栈的定义
(2) 栈的动态分配顺序存储结构描述 ① top为指针且指向栈顶元素的下一个位置 当top为指针且指向栈顶元素的下一个位置时,栈空 、入栈、栈满及出栈的情况如图3.3所示。初始化条 件为S.top=S.base。
…,n-1,n≥0} 数据关系:R={< ai-1,ai>| ai-1,ai∈D,i=1,2
,…,n-1 } 约定an-1端为栈顶,a0端为栈底 基本操作:
(1) 初始化操作:InitStack(&S) 需要条件:栈S没有被创建过 操作结果:构建一个空的栈S (2) 销毁栈:DestroyStack(&S) 需要条件:栈S已经被创建 操作结果:清空栈S的所有值,释放栈S占用的内存空间
return 1;
}
Data structures

第三章栈和队列

第三章栈和队列
西南交通大学信息科学与技术学院软件工程系‐赵宏宇
续8
//循环队列实现方案二 在SqQueue结构体中增设计数变量c,记录队列中当前 元素个数 void clearQueue(SqQueue &q) { q.r=q.f=-1; q.c=0; //r=f=-1~n-1区间任意整数均可 } int empty(SqQueue &q) { return q.c==0; } int full(SqQueue &q) { return q.c==q.n; } //队空、队满时q.f==q.r均为真 //优点:队满时没有空闲元素位置(充分利用了空间)
西南交通大学信息科学与技术学院软件工程系‐赵宏宇 数据结构A 第3章‐19
西南交通大学信息科学与技术学院软件工程系‐赵宏宇
数据结构A 第3章‐20
3.3 栈的应用
续1
3.3 栈的应用
续2
2. 栈与递归 (1) 递归程序的存储空间消耗 由于函数调用的指令返回地址、形式参数以及断 点状态均用系统堆栈实现存储,因此递归调用的层次 数(深度)决定了系统堆栈必须保留的存储空间容量大小。 例1 以下函数用递归法实现n元一维数组元素逆序存储, 试分析所需栈的深度。 void reverse(ElemTp a[], int i, int j) //数组a下标范围i..j实现元素逆序存储 { if(i<j) { a[i]a[j]; reverse(a, i+1, j-1); } }
西南交通大学信息科学与技术学院软件工程系‐赵宏宇 数据结构A 第3章‐7
3. 堆栈习题举例 例1 若元素入栈次序为ABC,写出所有可能的元素出栈 次序。 答: 所有可能的元素出栈次序共5种,即 ABC 操作PXPXPX (P表示入栈,X表示退栈) ACB PXPPXX BAC PPXXPX BCA PPXPXX CBA PPPXXX

第3章 栈和队列

第3章 栈和队列

例五、 表达式求值 例五、
限于二元运算符的表达式定义:
操作数) 运算符 运算符) 操作数 操作数) 表达式 ::= (操作数 + (运算符 + (操作数 操作数 操作数 ::= 简单变量 | 表达式 简单变量 :: = 标识符 | 无符号整数
表达式的三种标识方法: 表达式的三种标识方法: 设 Exp = S1 + OP + S2 则称 OP + S1 + S2 S1 + OP + S2 S1 + S2 + OP 为前缀表示法 前缀表示法 为中缀表示法 中缀表示法 为后缀表示法 后缀表示法
例如:(1348)10 = (2504)8 ,其 例如: 运算过程如下:
计 算 顺 序
N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2
输 出 顺 序
void conversion () { InitStack(S); scanf ("%d",&N); while (N) { Push(S, N % 8); N = N/8; } while (!StackEmpty(S)) { Pop(S,e); printf ( "%d", e ); } } // conversion
栈和队列是两种常用的数据类型
3.1 栈的类型定义 3.2 栈的应用举例 3.3 栈类型的实现 3.4 队列的类型定义 3.5 队列类型的实现
3.1 栈的类型定义
ADT Stack { 数据对象: 数据对象 D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } 数据关系: 数据关系 R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n } 约定an 端为栈顶,a1 端为栈底。 基本操作: 基本操作: } ADT Stack

数据结构栈和队列B

数据结构栈和队列B
J4 J5
5
front
rear
问3: 在具有n个单元的循 环队列中,队满时共有多少 个元素? N-1个
3.2 队列
20
循环队列:

队列存放数组被当作首尾相接的表处理。
队头、队尾指针加1时从maxSize -1直接进到0,可用语言的取 模(余数)运算实现。

队空: 队满: 入队: 出队: 求队长:
Q.front =Q. rear Q.front =(Q.rear + 1) % maxSize Q.rear = (Q.rear + 1) % maxSize Q.front = (front + 1) % maxSize; (Q.rear-Q.front+maxSize)%maxSize
rear
M-1 0 1
实现:利用“模”运算 入队:rear=(rear+1)%M; sq[rear]=x; 出队:front=(front+1)%M; x=sq[front]; 队满、队空判定条件
front
循环队列示意图:
假上溢的解决办法 把顺序队列看成首尾相接的环(钟表)-循环队列 基本操作的实现
队空条件 : front = rear (初始化时:front = rear ) 队满条件: front = (rear+1) % N (N=maxsize) 队列长度(即数据元素个数):L=(N+rear-front)% N
6 问1:左图中队列maxsize N=?
J2 J1 J3
问2:左图中队列长度L=?
链队列类型定义: typedef struct { QueuePtr front ; //队首指针 QueuePtr rear ; //队尾指针 } LinkQueue;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

栈和队列的进出规则
栈和队列是计算机科学中常见的数据结构,它们是程序设计中必不可少的基础知识。

它们的进出规则是很重要的,这是因为这些规则决定了如何访问数据。

本文将介绍栈和队列的进出规则,以及它们在实际应用中的作用。

一、栈的进出规则
栈是一种后进先出(LIFO)的数据结构。

栈中的数据项只能通过栈顶进行访问和操作。

当一个数据项被添加到栈中时,它被放置在栈顶。

当一个数据项被从栈中移除时,它是从栈顶移除的。

这意味着最后添加到栈中的数据项将是第一个被移除的数据项。

栈的进出规则可以用两个操作来描述:push和pop。

push操作将一个数据项添加到栈中,而pop操作将一个数据项从栈中移除。

这两个操作必须按照正确的顺序进行,否则会导致栈中的数据项出现错误的顺序。

栈的进出规则在实际应用中非常有用。

例如,在计算机程序中,栈可以用来存储函数调用的参数和局部变量。

当一个函数被调用时,它的参数和局部变量被添加到栈中。

当函数返回时,这些数据项被从栈中移除。

二、队列的进出规则
队列是一种先进先出(FIFO)的数据结构。

队列中的数据项只能通过队列的前端进行访问和操作。

当一个数据项被添加到队列中时,它被放置在队列的尾端。

当一个数据项被从队列中移除时,它是从队
列的前端移除的。

这意味着最先添加到队列中的数据项将是第一个被移除的数据项。

队列的进出规则可以用两个操作来描述:enqueue和dequeue。

enqueue操作将一个数据项添加到队列中,而dequeue操作将一个数据项从队列中移除。

这两个操作必须按照正确的顺序进行,否则会导致队列中的数据项出现错误的顺序。

队列的进出规则在实际应用中也非常有用。

例如,在操作系统中,队列可以用来存储进程等待执行的任务。

当一个任务完成时,它被从队列中移除,并且下一个任务被添加到队列中。

三、栈和队列在实际应用中的作用
栈和队列在计算机科学中有着广泛的应用。

它们被用于许多不同的领域,包括编译器、操作系统、数据库和图形界面设计。

在编译器中,栈被用来存储函数调用的参数和局部变量。

当一个函数被调用时,它的参数和局部变量被添加到栈中。

当函数返回时,这些数据项被从栈中移除。

这使得编译器能够正确地管理函数调用和返回的数据。

在操作系统中,队列被用来存储进程等待执行的任务。

当一个任务完成时,它被从队列中移除,并且下一个任务被添加到队列中。

这使得操作系统能够正确地管理进程和任务的执行顺序。

在数据库中,栈和队列被用来管理事务和查询语句的执行顺序。

这使得数据库能够正确地执行复杂的查询和事务操作。

在图形界面设计中,栈和队列被用来管理用户界面的状态和事件。

当用户执行一个操作时,它被添加到栈或队列中。

当用户撤消一个操作时,它被从栈或队列中移除。

这使得图形界面能够正确地管理用户界面的状态和事件。

总之,栈和队列是计算机科学中非常重要的数据结构。

它们的进出规则决定了如何访问数据。

在实际应用中,它们被用于许多不同的领域,包括编译器、操作系统、数据库和图形界面设计。

因此,了解它们的进出规则是非常重要的。

相关文档
最新文档