栈和队列的运用.docx
- 文档编号:3837742
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:15
- 大小:49.15KB
栈和队列的运用.docx
《栈和队列的运用.docx》由会员分享,可在线阅读,更多相关《栈和队列的运用.docx(15页珍藏版)》请在冰豆网上搜索。
栈和队列的运用
实训题三栈和队列的运用
一、实训目的
1.掌握栈的数据类型描述及栈的特点。
2.掌握栈的顺序和链式两种存储结构的特点及算法描述。
3.掌握栈的5种基本运算及算法在不同存储结构上的实现。
4.掌握队列的数据类型描述及链式存储结构的特点和算法描述。
5.掌握队列的5种基本运算及在链式存储结构上的实现。
二、实训内容
1.设车辆厂生产了硬座车厢和软座车厢共n节(混合在一起),要求用顺序栈的5种运算使所有的硬座车厢排列到所有软座车厢的前面。
2.利用栈将中缀表达式转换成等价的后缀表达式。
3.将一个正整数n转换成十六进制,要求用链栈的5种运算来实现。
4.停车场管理。
设有一个可以停放n辆汽车的狭长停车场(先进后出),它只有一个大门可以供车辆进出。
车辆按达到停车场时间的先后依次从停车场最里面向大门口停放(最先到达的第一辆车停放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车就可以进入停车场。
停车场内如有有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进停车场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车没进停车场就要离开,允许其离开,不受停车费,并且仍然保持在便道上的车辆次序。
是编程模拟停车场管理。
三、算法描述
1.第1题的算法实现
#include
#defineelemtypechar
constmaxsize=1000;
classseqstack
{
public:
elemtypestack[maxsize];
inttop;
voidinistack()
{
top=0;
}
voidpush(elemtypex)
{
if(top==maxsize-1)cout<<"overflow";
else
{
top++;
stack[top]=x;
}
}
voidpop()
{
if(top==0)cout<<"underflow";
elsetop--;
}
elemtypegettop()
{
if(top==0){cout<<"underflow";return0;}
elsereturnstack[top];
}
boolempty()
{
if(top==0)returntrue;
elsereturnfalse;
}
};
voidmain()
{
intn,i;
elemtypex;
seqstackS;
S.inistack();
cout<<"请输入车厢数";
cin>>n;
cout<<"请输入"< for(i=1;i<=n;i++) { cin>>x; if(x=='H')cout< elseS.push(x); } while(! S.empty()) { x=S.gettop(); cout< S.pop(); } cout< } 程序的结果: 2.第2题的算法实现 #include #define elemtype char const maxsize=1000; elemtype s1[maxsize],s2[maxsize]; class seqstack { public: elemtype stack[maxsize]; int top; void inistack() { top=0; } void push(elemtype x) { top++; stack[top]=x; } void pop() { top--; } elemtype gettop() { return stack[top]; } bool empty() { if(top==0) return true; else return false; } int oper(elemtype op) { switch(op) { case'+': case'-': return 1; case'*': case'/': return 2; case'(': return 0; default: return 0; } } void change() { elemtype y,ch;top=0; inistack();push('@'); int i=0,j=0; ch=s1[i]; while(ch! ='@') { if(ch==' ') ch=s1[++i]; else if(ch=='('){push(ch);ch=s1[++i];} else if(ch==')'){y=gettop(); while(y! ='(') {s2[j++]=y;s2[j++]=' ';pop();y=gettop();} pop();ch=s1[++i];} else if((ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')) { y=gettop();if(oper(ch)>oper(y)) {push(ch);ch=s1[++i];} else {y=gettop();s2[j++]=y;s2[j++]=' ';pop(); } } else {while(((ch>='0')&&(ch<='9'))||(ch=='.')) {s2[j++]=ch;ch=s1[++i];} s2[j++]=' '; } } y=gettop(); while(y! ='@') {s2[j++]=y;s2[j++]=' ';pop();y=gettop();} s2[j]='@'; } }; void main() {seqstack s; elemtype ch;int i=0; cout<<"请输入中缀表达式('@'结束): "; cin>>ch; while(ch! ='@') {s1[i++]=ch; cin>>ch;} s1[i]='@'; cout<<"中缀表达式为: "< for(int j=0;j cout< s.change(); cout<<"后缀表达式为: "< j=0; while(s2[j]! ='@') {cout< cout< } 程序的结果 3.第3题的算法运算 #include #defineelemtypechar classlink { public: elemtypedata; link*next; }; classlinkstack { public: link*top; voidinistack() { top=newlink; top->next=NULL; } voidpush(elemtypex) { link*s=newlink; s->data=x; s->next=top->next; top->next=s; } voidpop() { link*s=top->next; if(s! =NULL) { top->next=s->next; deletes; } } elemtypegettop() { if(top->next! =NULL) return(top->next->data); elsereturnNULL; } boolempty() { if(top->next==NULL)returntrue; elsereturnfalse; } voiddecTOhex(intn) { elemtypex; inistack(); while(n); {intj=n%16; if(j<10)x=j+48; elsex=j+55; push(x); n=n/16; } while(! empty()) { x=gettop(); cout< pop(); } cout< } }; voidmain() { intn;linkstacks; cout<<"请输入十进制正整数: "; cin>>n; cout<<"十进制数"< s.decTOhex(n); } 程序的结果: 4.第4题的算法实现 #include constintN=5; constintM=6; typedefstruct { intnum; intarrtime; }elemtype; structseqstack { elemtypestack[N+1]; inttop; }s1,s2; structlink { elemtypedata; link*next; }; structlinkqueue { link*front,*rear; }q; seqstackinistack(seqstackS) { S.top=0; returnS; } seqstackpush(seqstackS,elemtypex) { S.top++; S.stack[S.top]=x; returnS; } seqstackpop(seqstackS) { S.top--;returnS; } elemtypegettop(seqstackS) { returnS.stack[S.top]; } intempty(seqstackS) { if(S.top==0)return1; elsereturn0; } linkqueueiniqueue(linkqueues) { link*p; p=newlink; p->next=NULL; s.front=s.rear=p; returns; } linkqueueenqueue(linkqueues,elemtypex) { link*p; p=newlink; p->data=x; p->next=s.rear->next; s.rear->next=p; s.rear=p; returns; } linkqueuedlqueue(linkqueues) { link*p=s.front; s.front=p->next; deletep; returns; } elemtypegethead(linkqueues) { returns.front->next->data; } intemptyqueue(linkqueues) { if(s.front==s.rear)return1; elsereturn0; } voidarrive(elemtypex) { if(s1.top==N) q=enqueue(q,x); elses1=push(s1,x); } voiddelive(elemtypex) { intf=1;elemtypey; link*r; while((! empty(s1))&&(f==1)) if(s1.stack[s1.top].num! =x.num) {y=gettop(s1);s1=pop(s1);s2=push(s2,y);} else{ f=0;y=gettop(s1);s1=pop(s1); cout<<"停车场中有编号为"< cout<<"该车将离开,应收停车费: "<<(x.arrtime-y.arrtime)*M<<"元"< while(! empty(s2)) {y=gettop(s2);s2=pop(s2);s1=push(s1,y);} if(! emptyqueue(q)){ y=gethead(q); q=dlqueue(q); s1=push(s1,y); } } if(empty(s1)) { while(! empty(s2)) {y=gettop(s2);s2=pop(s2);s1=push(s1,y);} if(! emptyqueue(q)) { link*p=q.front; while((p! =NULL)&&(p->data.num! =x.num)) {r=p;p=p->next;} if(p! =NULL){ cout<<"便道上有编号为"< cout<<"该车将离开,应收停车费0.00元: "< r->next=p->next;deletep; } else cout<<"便道上没有编号为"< ! "< } } } voidpr1() { intt=s1.top; cout<<"停车场中的车辆编号和到达时间"< while(t! =0) { cout< t--;} cout< } voidpr2() { link*p=q.front->next; cout<<"便道中的车辆编号和到达时间"< while(p! =NULL) { cout< p=p->next; } cout< } voidmain() { intn; elemtypex; s1=inistack(s1); s2=inistack(s2); q=iniqueue(q); while (1){ cout< cout<<"请输入车辆编号、到达或离开的时间"< cin>>x.num>>x.arrtime; cout<<"请输入处理车辆的代号(1到达2离开3结束)"; cin>>n; if(n==1){arrive(x);pr1();pr2();} elseif(n==2){delive(x);pr1();pr2();} elsebreak; } cout< } 程序的结果: 实验总结: 这次实验当中,有很多符号,程序本身也很长,所以一个程序有很多错误,找的时候有不知所以。 有些定义也不是很清楚,总之,这次实验做的相当的差。 不过,我会吸取这次种种错误的原因,以便下次不会再出同样的错误。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 运用