数据结构与算法教学课件ppt作者王曙燕chapter3栈和队列PPT资料.ppt
《数据结构与算法教学课件ppt作者王曙燕chapter3栈和队列PPT资料.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法教学课件ppt作者王曙燕chapter3栈和队列PPT资料.ppt(43页珍藏版)》请在冰豆网上搜索。
,当栈中没有元素时称为空栈。
栈的插入操作被形象地称为进栈或入栈。
栈的删除操作称为出栈或退栈。
特点:
后进先出(LIFO),进栈,出栈,4,第3章栈和队列,3.2栈,顺序栈,链栈,5,第3章栈和队列,3.1栈,顺序栈,用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。
通常以top=-1表示空栈。
6,第3章栈和队列,3.2栈,顺序栈,的C语言描述,#defineStack_Size50typedefstructStackElementTypeelemStack_Size;
inttop;
SeqStack;
A,B,C,top,top,top,top,D,top,E,top,7,第3章栈和队列,3.2栈,顺序栈的基本操作:
初始化,判栈空,判栈满,进栈,出栈,取栈顶元素,数据结构与算法,8,第3章栈和队列,3.2栈,顺序栈的基本操作:
初始化,voidInitStack(SeqStack*S)S-top=-1;
9,第3章栈和队列,3.1栈,顺序栈的基本操作:
判栈空,intIsEmpty(SeqStack*S)return(S-top=-1?
TRUE:
FALSE);
10,第3章栈和队列,3.2栈,顺序栈的基本操作:
判栈满,intIsFull(SeqStack*S)return(S-top=Stack_Size?
11,第3章栈和队列,3.2栈,顺序栈的基本操作:
进栈,intPush(SeqStack*S,StackElementTypex)if(S-top=Stack_Size)return(FALSE);
S-top+;
S-elemS-top=x;
return(TRUE);
12,第3章栈和队列,3.2栈,顺序栈的基本操作:
出栈,intPop(SeqStack*S,StackElementType*x)if(S-top=-1)return(FALSE);
else*x=S-elemS-top;
S-top-;
13,第3章栈和队列,3.2栈,顺序栈的基本操作:
取栈顶元素,intGetTop(SeqStackS,StackElementType*x)if(S-top=-1)return(FALSE);
14,第3章栈和队列,3.2栈,两栈共享技术,双端栈,主要利用了栈“栈底位置不变,而栈顶位置动态变化”的特性。
首先为两个栈申请一个共享的一维数组空间SM,将两个栈的栈底分别放在一维数组的两端,分别是0,M-1。
top0,top1,数据结构与算法,15,第3章栈和队列,3.2栈,两栈共享,数据结构定义:
#defineM100typedefstructStackElementTypeStackM;
StackElementTypetop2;
DqStack;
16,第3章栈和队列,3.2栈,两栈共享,初始化,voidInitStack(DqStack*S)S-top0=-1;
S-top1=M;
17,第3章栈和队列,3.2栈,两栈共享,进栈,intPush(DqStack*S,StackElementTypex,inti)if(S-top0+1=S-top1)return(FALSE);
switch(i)case0:
S-top0+;
S-StackS-top0=x;
break;
case1:
S-top1-;
S-StackS-top1=x;
default:
return(FALSE);
18,第3章栈和队列,3.2栈,两栈共享,出栈,intPop(DqStack*S,StackElementType*x,inti)switch(i)case0:
if(S-top0=-1)return(FALSE);
*x=S-StackS-top0;
S-top0-;
if(S-top1=M)return(FALSE);
*x=S-StackS-top1;
S-top1+;
19,第3章栈和队列,3.2栈,链栈,采用链表作为存储结构实现的栈。
为便于操作,采用带头结点的单链表实现栈。
因为栈的插入和删除操作仅限制在表头位置进行,所以链表的表头指针就作为栈顶指针。
若top-next=NULL,则代表空栈。
注意:
链栈在使用完毕时,应该释放其空间。
20,第3章栈和队列,3.2栈,链栈,数据结构定义:
typedefstructnodeStackElementTypedata;
structnode*next;
LinkStackNode,*LinkStack;
21,第3章栈和队列,3.2栈,链栈,进栈,temp,a1,temp,a2,temp-next=top-next;
top-next=temp;
intPush(LinkStacktop,StackElementTypex)LinkStackNode*temp;
temp=(LinkStackNode*)malloc(sizeof(LinkStackNode);
if(temp=NULL)return(FALSE);
temp-data=x;
temp-next=top-next;
top-next=temp;
22,第3章栈和队列,3.2栈,链栈,出栈,intPop(LinkStacktop,StackElementType*x)LinkStackNode*temp;
temp=top-next;
top-next=temp-next;
*x=temp-data;
free(temp);
23,第3章栈和队列,3.2栈,链栈,多栈运算,采用多个单链表来实现多个链栈,数据结构与算法,24,第3章栈和队列,3.2栈,链栈,多栈运算,数据结构描述,#defineM10typedefstructnodeStackElementTypedata;
LinkStacktopM;
数据结构与算法,25,第3章栈和队列,3.2栈,链栈,多栈运算,:
第i号栈的进栈操作,intPushi(LinkStacktopM,StackElementTypex)LinkStackNode*temp;
temp-next=topi-next;
topi-next=temp;
数据结构与算法,26,第3章栈和队列,3.2栈,链栈,多栈运算,:
第i号栈的出栈操作,intPopi(LinkStacktopM,StackElementType*x)LinkStackNode*temp;
temp=topi-next;
topi-next=temp-next;
数据结构与算法,27,第3章栈和队列,3.2栈,应用:
括号匹配问题,思想:
1)凡出现左括弧,则进栈;
2)凡出现右括弧,首先检查栈是否空若栈空,则表明该“右括弧”多余,否则和栈顶元素比较,若相匹配,则“左括弧出栈”,否则表明不匹配。
3)表达式检验结束时,若栈空,则表明表达式中匹配正确,否则表明“左括弧”有余。
28,第3章栈和队列,3.1栈,应用:
括号匹配问题,算法实现,voidBracketMatch(char*str)StackS;
inti;
charch;
InitStack(,29,第3章栈和队列,3.2栈,应用:
表达式求值,问题分析:
Exp=ab+(cd/e)f,1)确定计算规则,即明确运算符的优先级;
2)确定当前处理字符是运算符还是操作数;
(限于二元运算符的表达式),表达式:
=(操作数)+(运算符)+(操作数),操作数:
=简单变量|表达式,简单变量:
=标识符|无符号整数,3)每个运算符的运算次序要由它之后的一个运算符来定。
30,第3章栈和队列,3.2栈,应用:
表达式求值,3)若当前字符是操作数,则直接压入操作数栈;
4)若当前字符是操作符,且运算符的优先级高于栈顶运算符则进栈;
5)否则,从操作数栈中弹出两个操作数并弹出操作符栈的栈顶运算符,经计算后将结果压入操作数栈。
(限于二元运算符的表达式),算法思路:
1)设立操作数栈与操作符栈;
2)设表达式的结束符为“#”,预设运算符栈的栈底为“#”;
31,第3章栈和队列,3.2栈,应用:
表达式求值,(限于二元运算符的表达式),例如:
A/BC+D*E,#,A,/,B,C,BC,T
(1)=,T
(1),A/T
(1),T
(2)=,T
(2),+,D,*,E,D*E,T(3)=,T(3),T(3)+T
(2),T(4)=,T(4),操作数的栈底中存着最终的表达式结果。
#,32,第3章栈和队列,3.2队列,定义:
限定所有的插入操作在表的一端进行,而删除操作在表的另一端进行的线性表。
通常将表中允许进行插入操作的一端称为队尾(rear),允许进行删除操作的一端称为队头(front)。
当队列中没有元素时称为空队。
队列的插入操作称为入队。
队列的删除操作称为出队。
先进先出(FIFO),入队,出队,33,第3章栈和队列,3.3队列,链队列,链式映象,顺序映象,循环队列,34,第3章栈和队列,3.3队列,循环队列,35,第3章栈和队列,3.3队列,循环队列,约定:
尾指针指示队列中队尾元素的后一个位置。
数据结构定义,typedefstructQueueElementTypeelementmaxsize;
intfront;
intrear;
SeqQu