改写顺序栈的进栈成员函数Push.docx
- 文档编号:7863287
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:21
- 大小:27.31KB
改写顺序栈的进栈成员函数Push.docx
《改写顺序栈的进栈成员函数Push.docx》由会员分享,可在线阅读,更多相关《改写顺序栈的进栈成员函数Push.docx(21页珍藏版)》请在冰豆网上搜索。
改写顺序栈的进栈成员函数Push
4-2改写顺序栈的进栈成员函数Push(x),要求当栈满时执行一个stackFull()操作进行栈满处理。
其功能是:
动态创建一个比原来的栈数组大二倍的新数组,代替原来的栈数组,原来栈数组中的元素占据新数组的前MaxSize位置。
【解答】template
:
push(constType&item){
if(isFull())stackFull(); //栈满,做溢出处理
elements[++top]=item; //进栈
}
template
:
stackFull(){
Type*temp=newType[3*maxSize]; //创建体积大二倍的数组
for(inti=0;i<=top;i++) //传送原数组的数据
temp[i]=elements[i];
delete[]elements; //删去原数组
maxSize*=3; //数组最大体积增长二倍
elements=temp; //新数组成为栈的数组空间
}
4-3铁路进行列车调度时,常把站台设计成栈式结构的站台,如右图所示。
试问:
(1)设有编号为1,2,3,4,5,6的六辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?
(2)若进站的六辆列车顺序如上所述,那么是否能够得到435612,325641,154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。
【解答】
(1)可能的不同出栈序列有 种。
(2)不能得到435612和154623这样的出栈序列。
因为若在4,3,5,6之后再将1,2出栈,则1,2必须一直在栈中,此时1先进栈,2后进栈,2应压在1上面,不可能1先于2出栈。
154623也是这种情况。
出栈序列325641和135426可以得到。
3
5
6
2
2
4
4
4
4
1
1
1
1
1
1
1
1
3 32 32 325 325 3256 32564 325641
5
3
4
4
1
2
2
2
2
6
1 1 13 135 1354 13542 13542 135426
4-4试证明:
若借助栈可由输入序列1,2,3,…,n得到一个输出序列p1,p2,p3,…,pn(它是输入序列的某一种排列),则在输出序列中不可能出现以下情况,即存在i (提示: 用反证法) 【解答】 因为借助栈由输入序列1,2,3,…,n,可得到输出序列p1,p2,p3,…,pn,如果存在下标i,j,k,满足i ①i进栈,i出栈,j进栈,j出栈,k进栈,k出栈。 此时具有最小值的排在最前面pi位置,具有中间值的排在其后pj位置,具有最大值的排在pk位置,有pi ②i进栈,i出栈,j进栈,k进栈,k出栈,j出栈。 此时具有最小值的排在最前面pi位置,具有最大值的排在pj位置,具有中间值的排在最后pk位置,有pi ③i进栈,j进栈,j出栈,i出栈,k进栈,k出栈。 此时具有中间值的排在最前面pi位置,具有最小值的排在其后pj位置,有pj ④i进栈,j进栈,j出栈,k进栈,k出栈,i出栈。 此时具有中间值的排在最前面pi位置,具有最大值的排在其后pj位置,具有最小值的排在pk位置,有pk ⑤i进栈,j进栈,k进栈,k出栈,j出栈,i出栈。 此时具有最大值的排在最前面pi位置,具有中间值的排在其后pj位置,具有最小值的排在pk位置,有pk 4-5写出下列中缀表达式的后缀形式: (1)A*B*C (2)-A+B-C+D (3)A*-B+C (4)(A+B)*D+E/(F+A*D)+C (5)A&&B||! (E>F) /*注: 按C++的优先级*/ (6)! (A&&! ((B 【解答】 (1)AB*C* (2)A-B+C-D+ (3)AB-*C+ (4)AB+D*EFAD*+/+C+ (5)AB&&EF>! || (6)ABC &&! CE<|| 4-7设表达式的中缀表示为a*x-b/x↑2,试利用栈将它改为后缀表示ax*bx2↑/-。 写出转换过程中栈的变化。 【解答】 步序 扫描项 项类型 动作 栈的变化 输出 0 '#'进栈,读下一符号 # 1 a 操作数 直接输出,读下一符号 # a 2 * 操作符 isp('#') #* a 3 x 操作数 直接输出,读下一符号 #* ax 4 - 操作符 isp('*')>icp('-'),退栈输出 # ax* isp('#') #- ax* 5 b 操作数 直接输出,读下一符号 #- ax*b 6 / 操作符 isp('-') #-/ ax*b 7 x 操作数 直接输出,读下一符号 #-/ ax*bx 8 ↑ 操作符 isp('/') #-/↑ ax*bx 9 2 操作数 直接输出,读下一符号 #-/↑ ax*bx2 10 # 操作符 isp('↑')>icp('#'),退栈输出 #-/ ax*bx2↑ isp('/')>icp('#'),退栈输出 #- ax*bx2↑/ isp('-')>icp('#'),退栈输出 # ax*bx2↑/- 结束 4-9假设以数组Q[m]存放循环队列中的元素,同时以rear和length分别指示环形队列中的队尾位置和队列中所含元素的个数。 试给出该循环队列的队空条件和队满条件,并写出相应的插入(enqueue)和删除(dlqueue)元素的操作。 【解答】 循环队列类定义 #include template public: queue(int=10); ~Queue(){delete[]elements;} voidEnQueue(Type&item); TypeDeQueue(); TypeGetFront(); voidMakeEmpty(){length=0;} //置空队列 intIsEmpty()const{returnlength==0;} //判队列空否 intIsFull()const{returnlength==maxSize;} //判队列满否 private: intrear,length; //队尾指针和队列长度 Type*elements; //存放队列元素的数组 intmaxSize; //队列最大可容纳元素个数 } 构造函数 template Queue : Queue(intsz): rear(maxSize-1),length(0),maxSize(sz){ //建立一个最大具有maxSize个元素的空队列。 elements=newType[maxSize]; //创建队列空间 assert(elements! =0); //断言: 动态存储分配成功与否 } 插入函数 template voidqueue : Enqueue(Type&item){ assert(! IsFull()); //判队列是否不满,满则出错处理 length++; //长度加1 rear=(rear+1)%maxSize; //队尾位置进1 elements[rear]=item; //进队列 } 删除函数 template Typequeue : Dequeue(){ assert(! IsEmpty()); //判断队列是否不空,空则出错处理 length--; //队列长度减1 returnelements[(rear-length+maxSize)%maxSize]; //返回原队头元素值 } 读取队头元素值函数 template TypeQueue : GetFront(){ assert(! IsEmpty()); returnelements[(rear-length+1+maxSize)%maxSize]; //返回队头元素值 } 4-10假设以数组Q[m]存放循环队列中的元素,同时设置一个标志tag,以tag==0和tag==1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。 试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。 【解答】 循环队列类定义 #include template public: Queue(int=10); ~Queue(){delete[]Q;} voidEnQueue(Type&item); TypeDequeue(); TypeGetFront(); voidMakeEmpty(){front=rear=tag=0;} //置空队列 intIsEmpty()const{returnfront==rear&&tag==0;} //判队列空否 intIsFull()const{returnfront==rear&&tag==1;} //判队列满否 private: intrear,front,tag; //队尾指针、队头指针和队满标志 Type*Q; //存放队列元素的数组 intm; //队列最大可容纳元素个数 } 构造函数 template queue : queue(intsz): rear(0),front(0),tag(0),m(sz){ //建立一个最大具有m个元素的空队列。 Q=newType[m]; //创建队列空间 assert(Q! =0); //断言: 动态存储分配成功与否 } 插入函数 template voidQueue : EnQueue(Type&item){ assert(! IsFull()); //判队列是否不满,满则出错处理 rear=(rear+1)%m; //队尾位置进1,队尾指针指示实际队尾位置 Q[rear]=item; //进队列 tag=1; //标志改1,表示队列不空 } 删除函数 template TypeQueue : DeQueue(){ assert(! IsEmpty()); //判断队列是否不空,空则出错处理 front=(front+1)%m; //队头位置进1,队头指针指示实际队头的前一位置 tag=0; //标志改0,表示栈不满 returnQ[front]; //返回原队头元素的值 } 读取队头元素函数 template Typequeue : GetFront(){ assert(! IsEmpty()); //判断队列是否不空,空则出错处理 returnQ[(front+1)%m]; //返回队头元素的值 } 4-11若使用循环链表来表示队列,p是链表中的一个指针。 试基于此结构给出队列的插入(enqueue)和删除(dequeue)算法,并给出p为何值时队列空。 【解答】 链式队列的类定义 template template friendclassQueue private: Typedata; //数据域 QueueNode public: QueueNode(Typed=0,QueueNode*l=NULL): data(d),link(l){} //构造函数 }; template public: Queue(): p(NULL){} //构造函数 ~Queue(); //析构函数 voidEnQueue(constType&item); //将item加入到队列中 TypeDeQueue(); //删除并返回队头元素 TypeGetFront(); //查看队头元素的值 voidMakeEmpty(); //置空队列,实现与~queue()相同 intIsEmpty()const{returnp==NULL;} //判队列空否 private: queueNode }; 队列的析构函数 template : ~Queue(){ //队列的析构函数 QueueNode while(p! =NULL){s=p; p=p->link; deletes;} //逐个删除队列中的结点 } 队列的插入函数 template : EnQueue(constType&item){ if(p==NULL){ //队列空,新结点成为第一个结点 p=newQueueNode } else { //队列不空,新结点链入p之后 QueueNode s->link=p->link; p=p->link=s; //结点p指向新的队尾 } } 队列的删除函数 template : DeQueue(){ if(p==NULL){cout<<"队列空,不能删除! "< QueueNode p->link=s->link; //重新链接,将结点s从链中摘下 Typeretvalue=s->data; deletes; //保存原队头结点中的值,释放原队头结点 returnretvalue; //返回数据存放地址 } 队空条件p==NULL。 4-12若将一个双端队列顺序表示在一维数组V[m]中,两个端点设为end1和end2,并组织成一个循环队列。 试写出双端队列所用指针end1和end2的初始化条件及队空与队满条件,并编写基于此结构的相应的插入(enqueue)新元素和删除(dlqueue)算法。 end2 【解答】 初始化条件end1=end2=0; end1 队空条件end1=end2; 队满条件(end1+1)%m=end2; //设end1端顺时针进栈,end2端逆时针进栈 循环队列类定义 #include template public: DoubleQueue(int=10); ~DoubleQueue(){delete[]V;} voidEnQueue(Type&item,constintend); TypeDeQueue(constintend); TypeGetFront(constintend); voidMakeEmpty(){end1=end2=0;} //置空队列 intIsEmpty()const{returnend1==end2;} //判两队列空否 intIsFull()const{return(end1+1)%m==end2;} //判两队列满否 private: intend1,end2; //队列两端的指针 Type*V; //存放队列元素的数组 intm;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 改写 顺序 成员 函数 Push