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