,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,第3章,栈和队列,3.1栈的概念,3.2栈的存储结构,3.3顺序栈的操作算法,3.4链栈的操作算法,3.5栈的应用举例-表达式求值,证餐烘渣耙牵淀雷上峻铸数责被辩俯硝卢幽幕浆镁涅渝赃抽庆箭卡迫梯展数据结构第3章栈和队列数据结构第3章栈和队列,第3章 栈和队列证餐烘渣耙牵淀雷上,1,第3章,栈和队列,3.6队列的概念,3.7队列的存储结构,3.8循环队列的操作算法,3.9链队的操作算法,屉只立症扇叔缴肌坠济兑褪汾垒凑胡舔砍良趁见枯昭禾镑扣距吮残愁蔷缨数据结构第3章栈和队列数据结构第3章栈和队列,第3章 栈和队列屉只立症扇叔缴肌坠,2,第三章 栈和队列,3.1,栈的概念,1.,定义:,栈,(Stack),是限定仅在表的,一端,进行插入或删除操作的线性表。,2.,栈的示意图 P44,3.,栈的抽象数据类型定义 P45,售贝觅迸隔鞘箭立籽恼忽翅荐骇违避袱闷反钎掣亏仟梦读阉妒寸帕迂近券数据结构第3章栈和队列数据结构第3章栈和队列,第三章 栈和队列 3.1栈的概念售贝觅迸隔鞘箭立籽恼忽翅荐,3,3.2,栈的存储结构,有两种存储结构,:,顺序,栈(常用);,链,栈,漾富盲殃治拢疟炒灵匀肛麻早茵件双啥曹映赚磨免蜘嘎贯蹲渤崭檬炬二蔓数据结构第3章栈和队列数据结构第3章栈和队列,3.2 栈的存储结构漾富盲殃治拢疟炒灵匀肛麻早茵件双啥曹映赚,4,1、顺序栈,厦拷赐椒侮园撮蓄叛溶熏鄙活瞪迅忠且再缩洪决谢婚跺梢皋匡催见盎紧姥数据结构第3章栈和队列数据结构第3章栈和队列,1、顺序栈 厦拷赐椒侮园撮蓄叛溶熏鄙活瞪迅忠且再缩洪决谢婚跺,5,顺序栈的类型定义:,/-栈的顺序存储表示-#define STACK_NINT_SIZE 100;/存储空间初始分配量#define STACKINCREMENT 10;/存储空间分配增量typedef structSElemType*base;/在栈构造之前和销毁之后,base的值为NULLSElemType*top;/栈顶指针int stacksize;/当前已分配的存储空间,以元素为单位SqStack,雅侵掖弟猴壶艰笛是辖奔垫栏绘欲撂幕迈纷疑孔空瞥秸行萨畅靡吼顿云渭数据结构第3章栈和队列数据结构第3章栈和队列,顺序栈的类型定义:雅侵掖弟猴壶艰笛是辖奔垫栏绘欲撂幕迈纷疑孔,6,顺序栈的结构举例,阀殿冉纷盆研繁棱凡臻挟寄砾参沦藻队褂敬解贵戴遗钧琴申替长舞类光戴数据结构第3章栈和队列数据结构第3章栈和队列,顺序栈的结构举例阀殿冉纷盆研繁棱凡臻挟寄砾参沦藻队褂敬解贵戴,7,/-基本操作的函数原型说明-,Status,InitStack(SqStack,&,S);/构造一个空栈S,Status,GetTop(SqStack S,SElemType,&,e);/若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR,Status,Push(SqStack,&,S,SElemType e);/插入元素e为新的栈顶元素,Status,Pop(SqStack,&,S,SElemType,&,e);/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR,快溃挤僵琶蕴幼返凿悦叫救绪衫篮摹血惰峡鹤芬垮发舌戍檀媚挣窿改渠屎数据结构第3章栈和队列数据结构第3章栈和队列,/-基本操作的函数原型说明-,8,2,、链栈,姻呻廊磷铝讽摧闺稽释平乃豆缄大妆噎一筐悍默彤翻想紊驰疾苏坎莎崔伦数据结构第3章栈和队列数据结构第3章栈和队列,2、链栈 姻呻廊磷铝讽摧闺稽释平乃豆缄大妆噎一筐悍默彤翻想紊,9,链栈的类型定义:,typedef struct LNode/结点类型ElemType data;struct LNode*next;Lnode,*Linkstack;Linkstack S;,峻贮晰浪躺炙婆海乱班下余辆映斧雕杀铣讽邦拜泽父剥遮酥呻晓春盘贝官数据结构第3章栈和队列数据结构第3章栈和队列,链栈的类型定义:峻贮晰浪躺炙婆海乱班下余辆映斧雕杀铣讽邦拜泽,10,3.3 顺序栈的操作算法,1,建立一个空栈,Status InitStack(SqStack&S)/,构造一个空栈,S,S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType);,if(!S.base)exit(overflow);/,存储分配失效,S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/InitStack,礼苇缆外钠腥拈嚏郭初累益恶赶戎宇泉盎尤烫伤稍焰腑垢钎蚁澎注滓斗缠数据结构第3章栈和队列数据结构第3章栈和队列,3.3 顺序栈的操作算法 礼苇缆外钠腥拈嚏郭初累益恶赶戎宇,11,2.,取栈顶元素,Status GetTop(SqStack S,SElemType&e)/,若栈不空,则用,e,返回,S,的栈顶元素,,并返回,OK,;否则返回,ERRORif(S.top=S.base)return ERROR;e=*(S.top-1);return OK;/GetTop,宁星紊翼观胡准郧骚好钻撰频或怜寂裤梆枕宽筷卸关朽粗炸走肘搬矣叠晶数据结构第3章栈和队列数据结构第3章栈和队列,2.取栈顶元素Status GetTop(SqStack,12,3.压栈push,Status Push(SqStack/push,俭坪互庙耸妆扮欲口腕付类涂压逐逝犁粤霸咖倡吭烷斯萧涤瓜雪悯柠傅茵数据结构第3章栈和队列数据结构第3章栈和队列,3.压栈pushStatus Push(SqStack&,13,4.,出栈,popstatus Pop(SqStack&S,SElemType&e)/,若栈不为空,则删除,S,的栈顶元素,用,e,返回其值,并返回,OK,;否则返回,ERRORif(S.top=S.base)return ERROR;e=*-S.top;return OK;/Pop,猾信圈堰某石窿虏减贺林葛筷蝉赫戊烤仟鳞框微彩弟片忻诞辙跺扎钻佐窥数据结构第3章栈和队列数据结构第3章栈和队列,4.出栈popstatus Pop(SqStack&S,14,5,判断栈是否为空,int Empty(SqStack S)/,若栈为空,则返回,0,,否则返回,1if(s.top=s.base)return(0);else return(1);,6 判断栈是否为满,int Full(SqStack S)/,若栈为满,则返回,0,,否则返回,1if(s.top-s.base)=s.stacksize return(0);else return(1);,呜瞎言震羔汐疡拯芍搂汰调宇椰比羊涸袭灼练战贾替观衷捷碗递硫尽暑须数据结构第3章栈和队列数据结构第3章栈和队列,5 判断栈是否为空呜瞎言震羔汐疡拯芍搂汰调宇椰比羊涸袭灼练战,15,3.4 链栈的操作算法,(自学),1.,建立一个空栈(不带头结点),Status InitLStack(Linkstack/InitLStack,漱约移慧刷渣速朽硷埋桩茂楔跋糙测朱疫幸肮枕疼厘植谴裙考绦拈瞄侩农数据结构第3章栈和队列数据结构第3章栈和队列,3.4 链栈的操作算法(自学)漱约移慧刷渣速朽硷埋桩茂楔,16,2.,取栈顶元素,Status,GettopLStack(Linkstack,&,S,SElemType,&,e)/,若栈不为空,则用,e,返回,S,的栈顶元素,并返回,OK,否则返回,ERROR.if(S=NULL)return ERROR;e=S-data;return(OK);/GettopLStack,值棒铜译写詹礼通殿则诅监陈叮备迎很什艇滤斤敛居尺逼烧俞床岳心纂椭数据结构第3章栈和队列数据结构第3章栈和队列,2.取栈顶元素值棒铜译写詹礼通殿则诅监陈叮备迎很什艇滤斤敛居,17,3.,压栈,Push,Status PushLStack(Linkstack&S,SElemType e)/,插入元素,e,为新的栈顶元素,Lnode*p;p=(Lnode*)malloc(sizeof(Lnode);p-data=e;p-next=S;S=p;/PushLStack,诫噪氛睛臼暖浆加何拜染鹤磐黄酣孟丑抑燃峦沧肥耳殃肮聪勋帧爬轰胡霞数据结构第3章栈和队列数据结构第3章栈和队列,3.压栈Push诫噪氛睛臼暖浆加何拜染鹤磐黄酣孟丑抑燃峦沧肥,18,4.,出栈,Pop,Status,PopLStack(Linkstack&S,SElemType&e)/,若栈不为空,则删除,S,的栈顶元素,,用,e,返回其值,并返回,OK,,否则返回,ERROR if(s=NULL)return ERROR;e=S-data;S=S-link;return OK;/PopLStack,仰壹踌壮刀辞凶赴歉段吵刺拉汰踩片醚挽愈暖片囊叔序蚀寥衫梯吓御绸躲数据结构第3章栈和队列数据结构第3章栈和队列,4.出栈Pop仰壹踌壮刀辞凶赴歉段吵刺拉汰踩片醚挽愈暖片囊叔,19,5.,判断栈是否为空,int link_empty(Linkstack,枷苟郊斯砖署牧蔓旨灸噬凝俏晚些沏返祝溯扣诸衔堤盲荣寥赫酋赘蜀鹏卖数据结构第3章栈和队列数据结构第3章栈和队列,5.判断栈是否为空枷苟郊斯砖署牧蔓旨灸噬凝俏晚些沏返祝溯扣,20,3.5 栈的应用举例1-数制转换,非负十进制整数转换为八进制数,1348D 2504O,N,N DIV 8,N MOD 8,1348,168,4,168,21,0,21,2,5,2,0,2,跺蔽爆沏氟渤旦泥菌沙钝牵返跌泛晓簿么瞄馏距燎任柄叭萝蒜佑叠碱踪啮数据结构第3章栈和队列数据结构第3章栈和队列,3.5 栈的应用举例1-数制转换非负十进制整数转换为八进,21,3.5 栈的应用举例2-表达式求值,算法的基本思想是:,(1)首先置操作数栈为空栈,表达式起始符“#”为运算符的栈底元素;,(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优符后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。,算法描述:p53-54 算法3.4,批驶绞嚎早鲤桑勋奏反僧淋泉鄙仔波觉殖写吮浆难剁胡劣绎朔古模矢匡寄数据结构第3章栈和队列数据结构第3章栈和队列,3.5 栈的应用举例2-表达式求值算法的基本思想是:批驶,22,表达式求值举例:计算3*(7-2),步骤,OPTR,栈,OPND,栈,输入字符,主要操作,说明,1,3*(7-2)#,push(opnd,3),3,2,3,*(7-2)#,push(optr,*),3 *,3,*,3,(7-2)#,push(optr,(),*(,4,*(,3,7-2)#,push(opnd,7),7,为操作数,5,*(,37,-2)#,push(optr,-),(),8,*(,35,)#,pop(optr),(=),9,*,35,#,operate(3,*,5),*#,10,15,#,返回,15,要捷阵近讯砒逼模仟则脂吧敛县线掠尾茶层般哼瘴钒傲耗抄细宙出歌崇侗数据结构第3章栈和队列数据结构第3章栈和队列,表达式求值举例:计算3*(7-2)步骤OPTR栈OPND输入,23,3.6队列的概念,1、,定义,:队列是一种先进先出,(FIFO:First In First Out),的线性表。它只允许在表的一端进行插入,而在另一端删除元素。,2,、,示意图,丝骆曹茧雹右肾皿穴疤史凯首岁派舷挟扬谎与龚朽句钨抨谰羊淌樟澄盅关数据结构第3章栈和队列数据结构第3章栈和队列,3.6队列的概念丝骆曹茧雹右肾皿穴疤史凯首岁派舷挟扬谎与龚朽,24,3,、,队列的抽象数据类型定义,队列的抽象数据类型定义:,ADT Queue,数据对象:D=ai|aiElemSet,i=1,2,.,n,n0,数据关系:R1=|ai-1,aiD,i=2,.,n,约定其中a1端为队列头,an为队列尾。,基本操作:,InitQue