2022年栈和队列资料 .pdf

上传人:H****o 文档编号:33382152 上传时间:2022-08-10 格式:PDF 页数:19 大小:101.61KB
返回 下载 相关 举报
2022年栈和队列资料 .pdf_第1页
第1页 / 共19页
2022年栈和队列资料 .pdf_第2页
第2页 / 共19页
点击查看更多>>
资源描述

《2022年栈和队列资料 .pdf》由会员分享,可在线阅读,更多相关《2022年栈和队列资料 .pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1 栈和队列1.顺序栈sqstack.h #include using namespace std; const int MAXSIZE=50; struct Elem int data; ; typedef int ElemType; struct SqStack ElemType baseMAXSIZE; int top; ; void initStack(SqStack& s); void clearStack(SqStack& s); bool isEmpty(SqStack& s); bool isFull(SqStack& s); ElemType peek(SqStack& s)

2、; void push(SqStack& s,const ElemType& e); ElemType pop(SqStack& s); sqstack.cpp #include sqstack.h void initStack(SqStack& s) s.top=0; void clearStack(SqStack& s) s.top=0; bool isEmpty(SqStack& s) return s.top=0; bool isFull(SqStack& s) return s.top=MAXSIZE; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -

3、 - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - 2 ElemType peek(SqStack& s) if(s.top=0) cerrStack is empty!endl; exit(1); return s.bases.top-1; void push(SqStack& s,const ElemType& e) if(s.top=MAXSIZE) cerrStack overflow!endl; exit(1); s.bases.top=e; +s.top; ElemType pop(SqStack

4、& s) if(s.top=0) cerrStack is empty!endl; exit(1); -s.top; ElemType temp=s.bases.top; return temp; main.cpp #include sqstack.h void conversion(int n,int r) SqStack s; initStack(s); while(n) push(s,n%r); n=n/r; while(!isEmpty(s) coutpop(s); coutendl; bool bracketsCheck(char* c) SqStack s; initStack(s

5、); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 19 页 - - - - - - - - - 3 for(int i=0;ci!=0;+i) switch(ci) case : case (: push(s,ci); break; case : if(peek(s)=) pop(s); else return false; break; case ): if(peek(s)=() pop(s); else return false; break; if(isEmpt

6、y(s) return true; else return false; int main() SqStack a; ElemType b=s,c=g; initStack(a); coutisEmpty(a)endl; push(a,b); coutpeek(a)endl; push(a,c); coutpeek(a)endl; coutisFull(a)endl; coutpop(a)endl; char h=3*(4+9); coutbracketsCheck(h)endl; conversion(1348,8); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

7、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 19 页 - - - - - - - - - 4 2.迷宫求解sqstack.h #include using namespace std; const int MAXSIZE=100; struct PosType / 迷宫坐标位置类型int x; / 行值int y; / 列值; struct Elem / 栈的元素类型int ord; / 通道块在路径上的序号PosType seat; / 通道块在迷宫中的坐标位置int di; / 从此通道块走向下一通道块的方向(03 表示东北 ) ;

8、typedef Elem ElemType; struct SqStack ElemType baseMAXSIZE; int top; ; void initStack(SqStack& s); void clearStack(SqStack& s); bool isEmpty(SqStack& s); bool isFull(SqStack& s); ElemType peek(SqStack& s); void push(SqStack& s,const ElemType& e); ElemType pop(SqStack& s); sqstack.cpp 同前main.cpp #inc

9、lude #include #include sqstack.h const int MAXLENGTH=25; / 设迷宫的最大行列为25 typedef int MazeTypeMAXLENGTHMAXLENGTH; / 迷宫数组 行 列 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 19 页 - - - - - - - - - 5 MazeType m; / 迷宫数组int curstep=1; / 当前足迹 ,初值为 1 / 定义墙元素值为0,可通过路径为1,不

10、能通过路径为-1,通过路径为足迹bool pass(PosType b) / 当迷宫 m 的 b 点的序号为1(可通过路径 ),return OK; 否则, return ERROR 。if(mb.xb.y=1) return true; else return false; void footPrint(PosType a) / 使迷宫 m 的 a点的序号变为足迹(curstep) ma.xa.y=curstep; PosType nextPos(PosType c,int di) / 根据当前位置及移动方向,返回下一位置PosType direc4=0,1,1,0,0,-1,-1,0; /

11、 行增量 ,列增量 / 移动方向 ,依次为东南西北c.x+=direcdi.x; c.y+=direcdi.y; return c; void markPrint(PosType b) / 使迷宫 m 的 b 点的序号变为-1(不能通过的路径) mb.xb.y=-1; bool mazePath(PosType start,PosType end) /若迷宫 maze 中存在从入口start 到出口 end 的通道,则求得一条/存放在栈中 (从栈底到栈顶 ),并返回TRUE;否则返回FALSE SqStack s; PosType curpos; ElemType e; initStack(s

12、); curpos=start; do if(pass(curpos) / 当前位置可以通过,即是未曾走到过的通道块footPrint(curpos); / 留下足迹e.ord=curstep; e.seat.x=curpos.x; e.seat.y=curpos.y; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 19 页 - - - - - - - - - 6 e.di=0; push(s,e); / 入栈当前位置及状态curstep+; / 足迹加 1 if(cu

13、rpos.x=end.x&curpos.y=end.y) / 到达终点 (出口 ) return true; curpos=nextPos(curpos,e.di); else / 当前位置不能通过if(!isEmpty(s) e=pop(s); / 退栈到前一位置curstep-; while(e.di=3&!isEmpty(s) / 前一位置处于最后一个方向(北) markPrint(e.seat); / 留下不能通过的标记(-1) e=pop(s); / 退回一步curstep-; if(e.di3) / 没到最后一个方向(北 ) e.di+; / 换下一个方向探索push(s,e);

14、curstep+; curpos=nextPos(e.seat,e.di); / 设定当前位置是该新方向上的相邻块 while(!isEmpty(s); return false; void print(int x,int y) / 输出迷宫的解for(int i=0;ix;i+) for(int j=0;jy;j+) coutsetw(3)mij; coutendl; int main() PosType begin,end; int x=8,y=10; begin.x=1; begin.y=1; end.x=6; end.y=8; ifstream infile; 名师资料总结 - - -

15、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - 7 infile.open(data.txt); /打开文件for(int i=0;i8;i+) for(int j=0;jmij; infile.close(); /关闭文件cout迷宫结构如下:n; print(x,y); if(mazePath(begin,end) / 求得一条通路cout 此迷宫从入口到出口的一条路径如下:n; print(x,y); / 输出此通路 else cout 此迷宫

16、没有从入口到出口的路径n; 3.表达式求值sqstack.h 应用函数模板#include using namespace std; const int MAXSIZE=100; template struct SqStack ElemType baseMAXSIZE; int top; ; template void initStack(SqStack& s) s.top=0; template void clearStack(SqStack& s) s.top=0; template bool isEmpty(SqStack& s) return s.top=0; template 名师资

17、料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 19 页 - - - - - - - - - 8 bool isFull(SqStack& s) return s.top=MAXSIZE; template ElemType peek(SqStack& s) if(s.top=0) cerrStack is empty!endl; exit(1); return s.bases.top; template void push(SqStack& s,const ElemType&

18、 e) if(s.top=MAXSIZE) cerrStack overflow!endl; exit(1); s.bases.top=e; +s.top; template ElemType pop(SqStack& s) if(s.top=0) cerrStack is empty!endl; exit(1); -s.top; ElemType temp=s.bases.top; return temp; change.cpp #include sqstack.h int precede(char op) switch(op) case +: case -: return 1; case

19、*: case /: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 19 页 - - - - - - - - - 9 return 2; case (: case : default: return 0; void change(char* s1,char* s2) /将字符串s1 中的中缀表达式转换为在于s2 中的后缀表达式SqStack r; initStack(r);/ 初始化栈push(r,);/给栈底放入 字符,它具有最低优先级int i,j; i=0; j=

20、0; char ch=s1i; while(ch!=) if(ch= ) ch=s1+i; else if(ch=() push(r,ch); ch=s1+i; else if(ch=) while(peek(r)!=() s2j+=pop(r); pop(r); ch=s1+i; else if(ch=+|ch=-|ch=*|ch=/) char w=peek(r); while(precede(w)=precede(ch) s2j+=w; pop(r); w=peek(r); push(r,ch); ch=s1+i; else while(isdigit(ch)|ch=.) s2j+=ch

21、; ch=s1+i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 19 页 - - - - - - - - - 10 s2j+= ; ch=pop(r); while(ch!=) if(ch=() cerrexpression error!endl; exit(1); else s2j+=ch; ch=pop(r); s2j+=; s2j+=0; compute.cpp #include sqstack.h #include double compute(char*

22、str) SqStack s; initStack(s); istringstream ins(str); / 把 str 定义为 string 流对象 ins,P82 char ch; /用于输入字符double x; / 用于输入浮点数insch; while(ch!=) switch(ch) case +: x=pop(s)+pop(s); break; case -: x=pop(s); /pop(s) 弹出减数x=pop(s)-x; /pop(s)弹出被减数break; case *: x=pop(s)*pop(s); break; case /: x=pop(s); 名师资料总结

23、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 19 页 - - - - - - - - - 11 if(x!=0.0) x=pop(s)/x; cerrDivide by 0!x; / 从字符串输入流中读入一个浮点数 push(s,x); /把读入的数或进行相应运算的结果压入到s 栈中insch; if(!isEmpty(s) x=pop(s); if(isEmpty(s) return x; else cerrexpression error!endl; exit(1); els

24、e cerrStack is emppty!endl; exit(1); main.cpp #include using namespace std; int precede(char op); void change(char* s1,char* s2); double compute(char* str); int main() char s1=34*(2+5)+3; char s230; change(s1,s2); couts2endl; double r=compute(s2); coutrendl; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -

25、- - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 19 页 - - - - - - - - - 12 4.迷宫的递归求解main.cpp #include #include #include using namespace std; const int MAXLENGTH=25; / 设迷宫的最大行列为25 typedef int MazeTypeMAXLENGTHMAXLENGTH; / 迷宫数组 行 列 struct PosType / 迷宫坐标位置类型int x; / 行值int y; / 列值; struct Elem / 栈的元素类型int

26、ord; / 通道块在路径上的序号PosType seat; / 通道块在迷宫中的坐标位置int di; / 从此通道块走向下一通道块的方向(03 表示东北 ) ; MazeType m; / 迷宫数组int curstep=0; / 当前足迹 ,初值为 1 / 定义墙元素值为0,可通过路径为1,不能通过路径为-1,通过路径为足迹bool pass(PosType b) / 当迷宫 m 的 b 点的序号为1(可通过路径 ),return true; 否则, return false。if(mb.xb.y=1) return true; else return false; void footP

27、rint(PosType a) / 使迷宫 m 的 a点的序号变为足迹(curstep) ma.xa.y=curstep; PosType nextPos(PosType c,int di) / 根据当前位置及移动方向,返回下一位置PosType direc4=0,1,1,0,0,-1,-1,0; / 行增量 ,列增量 / 移动方向 ,依次为东南西北c.x+=direcdi.x; c.y+=direcdi.y; return c; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12

28、 页,共 19 页 - - - - - - - - - 13 void markPrint(PosType b) / 使迷宫 m 的 b 点的序号变为-1(不能通过的路径) mb.xb.y=-1; void print(int x,int y) / 输出迷宫的解for(int i=0;ix;i+) for(int j=0;jy;j+) coutsetw(3)mij; coutendl; bool mazePath(PosType curpos,PosType end) /若迷宫 maze 中存在从入口start 到出口 end 的通道,则求得一条/存放在栈中 (从栈底到栈顶 ),并返回TRUE

29、;否则返回FALSE if(curpos.x=end.x&curpos.y=end.y) / 到达终点 (出口 ) return true; PosType nextpos; for(int i=0;i4;+i) nextpos=nextPos(curpos,i); if(pass(nextpos) markPrint(nextpos); if(mazePath(nextpos,end) curstep+; / 足迹加 1 footPrint(nextpos); return true; return false; int main() PosType begin,end; int x=8,y

30、=10; begin.x=1; begin.y=1; end.x=6; end.y=8; ifstream infile; infile.open(data.txt); /打开文件for(int i=0;i8;i+) for(int j=0;jmij; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 19 页 - - - - - - - - - 14 infile.close(); /关闭文件if(mazePath(begin,end) / 求得一条通路cout 此迷宫

31、从入口到出口的一条路径如下:n; print(x,y); / 输出此通路 else cout 此迷宫没有从入口到出口的路径n; 5. 链队列linkqueue.h #include using namespace std; struct ElemType int d; ; struct QNode ElemType data; QNode* next; ; struct LinkQueue QNode* front; QNode* rear; ; void initQueue(LinkQueue& q); void destroyQueue(LinkQueue& q); void clearQ

32、ueue(LinkQueue& q); bool isEmpty(LinkQueue q); int getLength(LinkQueue q); ElemType getHead(LinkQueue q); void insertElem(LinkQueue& q,ElemType e); ElemType deleteElem(LinkQueue& q); void traverseQueue(LinkQueue q,void (*visit)(ElemType&); linkqueue.cpp #include linkqueue.h void initQueue(LinkQueue&

33、 q) q.front=q.rear=new QNode; if(!q.front) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 19 页 - - - - - - - - - 15 exit(1); q.front-next=NULL; void destroyQueue(LinkQueue& q) while(q.front) q.rear=q.front-next; delete q.front; q.front=q.rear; void clearQueue(

34、LinkQueue& q) QNode* p=q.front-next; while(p) q.rear=p-next; delete p; p=q.rear; bool isEmpty(LinkQueue q) return q.front=q.rear; int getLength(LinkQueue q) int n=0; QNode* p=q.front-next; while(p) +n; p=p-next; return n; ElemType getHead(LinkQueue q) if(q.front=q.rear) cerrQueue is empty!next-data;

35、 void insertElem(LinkQueue& q,ElemType e) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 19 页 - - - - - - - - - 16 QNode* p=new QNode; p-data=e; p-next=NULL; q.rear-next=p; q.rear=p; ElemType deleteElem(LinkQueue& q) if(q.front=q.rear) cerrQueue is empty!next;

36、 ElemType e=p-data; q.front-next=p-next; if(q.rear=p) /若链队为空,则需同时使队尾指针指向头结点q.rear=q.front; delete p; return e; void traverseQueue(LinkQueue q,void (*visit)(ElemType&) QNode* p=q.front-next; while(p) visit(p-data); p=p-next; coutendl; main.cpp #include linkqueue.h void print(ElemType& e) coute.d ; in

37、t main() LinkQueue q; initQueue(q); ElemType a=3; ElemType b=5; insertElem(q,a); insertElem(q,b); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 19 页 - - - - - - - - - 17 coutgetLength(q)endl; traverseQueue(q,print); ElemType c=getHead(q); coutc.dendl; deleteE

38、lem(q); coutgetLength(q)endl; traverseQueue(q,print); 6.循环队列sqqueue.h #include using namespace std; const int MAXSIZE=3; struct ElemType int d; ; struct SqQueue ElemType* base; int front; int rear; ; void initQueue(SqQueue& q); void clearQueue(SqQueue& q); bool isEmpty(SqQueue& q); bool isFull(SqQue

39、ue& q); int getLength(SqQueue& q); ElemType getHead(SqQueue& q); bool insertElem(SqQueue& q,ElemType e); ElemType deleteElem(SqQueue& q); void traverseQueue(SqQueue& q,void (*visit)(ElemType&); sqqueue.cpp #include sqqueue.h void initQueue(SqQueue& q) q.base=new ElemTypeMAXSIZE; if(!q.base) exit(1);

40、 q.front=q.rear=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 19 页 - - - - - - - - - 18 void clearQueue(SqQueue& q) q.front=q.rear=0; bool isEmpty(SqQueue& q) return q.front=q.rear; bool isFull(SqQueue& q) return (q.rear+1)%MAXSIZE=q.front; int getLength(S

41、qQueue& q) return (q.rear-q.front+MAXSIZE)%MAXSIZE; ElemType getHead(SqQueue& q) if(q.front=q.rear) coutQueue is empty!endl; exit(1); return q.baseq.front; bool insertElem(SqQueue& q,ElemType e) if(q.rear+1)%MAXSIZE=q.front) coutQueue overflow!endl; return false; q.baseq.rear=e; q.rear=(q.rear+1)%MA

42、XSIZE; return true; ElemType deleteElem(SqQueue& q) if(q.front=q.rear) coutQueue is empty!endl; exit(1); ElemType e=q.baseq.front; q.front=(q.front+1)%MAXSIZE; return e; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 19 页 - - - - - - - - - 19 void traverseQueu

43、e(SqQueue& q,void (*visit)(ElemType&) if(q.front=q.rear) coutQueue is empty!endl; else int t=q.front; while(t!=q.rear) visit(q.baset); t=(t+1)%MAXSIZE; coutendl; main.cpp #include sqqueue.h void print(ElemType& e) coute.d ; int main() SqQueue q; initQueue(q); coutisEmpty(q)endl; ElemType a=3; ElemTy

44、pe b=5; insertElem(q,a); insertElem(q,b); coutgetLength(q)endl; coutisEmpty(q)endl; traverseQueue(q,print); ElemType c=getHead(q); coutHead:c.dendl; coutfull:isFull(q)endl; deleteElem(q); coutgetLength(q)endl; traverseQueue(q,print); deleteElem(q); traverseQueue(q,print); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 19 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁